一、柱狀圖
1.通過obj.plot()
柱狀圖用bar表示,可通過obj.plot(kind='bar')或者obj.plot.bar()生成;在柱狀圖中添加參數stacked=True,會形成堆疊圖。
fig,axes = plt.subplots(2,2,figsize=(10,6)) s = pd.Series(np.random.randint(0,10,15),index = list('abcdefghijklmno')) df = pd.DataFrame(np.random.rand(10,3),columns = ['A','B','C']) s.plot(kind = 'bar',ax = axes[0,0]) #kind表示圖表類型 df.plot(kind = 'bar',ax = axes[0,1]) df.plot.bar(ax = axes[1,0],stacked = True) #stacked = True表示顯示為堆疊樣式 df.plot.barh(ax = axes[1,1]) #橫向的柱狀圖
2.通過plt.bar(x,y)
直接使用plt.bar()時,需要在參數中指定x軸和y軸表示的數據。
plt.figure(figsize=(8,6)) x = np.arange(10) y1 = np.random.rand(10) y2 = -np.random.rand(10) plt.bar(x,y1,yerr = 0.1 * y1) for i,j in zip(x,y1): plt.text(i-0.3,j+0.05,'%.2f'%j) #添加標簽-0.3和+0.05是為了讓標簽的位置更合理 plt.bar(x,y2)
柱狀圖外嵌圖表
通過plt.table()可以實現在柱狀圖下方附上表格的功能。
plt.table(cellText=data.T,cellLoc='center',cellColours=None,rowLabels=cols,rowLoc='center',colLabels=rows,colLoc='center',loc='bottom')
- cellText:表格內容,通常為DataFrame的values部分
- cellLoc:表格內容的對齊方式,通常為center居中對齊
- cellColours:表格內容背景顏色
- rowLabels:行標簽
- rowLoc:行標簽的對齊方式
- colLabels:行標簽的背景顏色
- colLoc:列標簽的對齊方式
- loc:表格位置,常用bootom,
data = np.array([[1,2,3,1,2],[3,4,5,3,4],[2,3,4,2,3],[4,5,6,3,4]]) rows = ['x','y','z','w'] cols = ['a','b','c','d','e'] df = pd.DataFrame(data,index = rows,columns=cols) df.plot(kind='bar',stacked=True,colormap='Blues_r') plt.xticks([]) #去掉x軸的刻度標簽,避免與下方的表格的列標簽重合 plt.table(cellText=data.T,cellLoc='center',cellColours=None,rowLabels=cols,rowLoc='center',\ rowColours=plt.cm.BuPu(np.linspace(0,0.5,5))[::-1],colLabels=rows,colLoc='center',colColours=None,loc='bottom')
二、面積圖
面積圖使用obj.plot(kind='area')或者obj.plot.area()生成,沒有plt.area()方法。
面積圖默認是堆疊的,並且要求值必須同時為正值或同時為負值;如果既有正值也有負值,不能堆疊,需要使用參數stacked=False。
fig,axes = plt.subplots(1,2,figsize=(10,6)) df1 = pd.DataFrame(np.random.rand(10,3),columns=['A','B','C']) df2 = pd.DataFrame(np.random.randn(10,3),columns=['a','b','c']) df1.plot.area(colormap='summer',ax = axes[0]) df2.plot(kind='area',stacked = False,ax = axes[1])
三、填圖
填充x軸與一個y軸之間的空間:需要y軸與x軸有交叉,否則不會顯示
填充兩個y軸之間的空間:相當於兩個y軸的差
fig,axes = plt.subplots(1,2,figsize=(10,4)) x = np.linspace(0,1,500) y1 = np.sin(4*np.pi*x) y2 = -np.sin(4*np.pi*x) # y1 = 2*x # y2 = -x #調成y1和y2都沒有效果 axes[0].fill(x,y1,'lightblue',label='y1') axes[0].fill(x,y2,'pink',label='y2') axes[1].fill_between(x,y1,y2,color = 'lightblue',label='y1-y2')#此處需要用color指定顏色,直接寫顏色會報錯
四、餅圖
plt.pie(s,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,labeldistance=1.1,shadow=False,startangle=None,radius=None,frame=False)
- s:一個Seris
- explode:突出的餅塊位置及突出大小
- labels:餅塊的標簽
- colors:餅塊的顏色
- autopct:餅塊的值的顯示格式
- pctdistance:餅塊的值距離圓心的距離,相對於半徑來說
- labeldistance:標簽距離圓心的距離,相對於半徑來說
- shadow:是否顯示陰影
- startangle:第一個餅開始的地方,默認從水平線開始逆時針方向進行,30表示從水平方向逆時針旋轉30°的地方開始
- radius:半徑的長度
s = pd.Series(np.random.rand(4),index=['a','b','c','d']) plt.axis('equal') # plt.pie(s,explode=[0.1,0,0,0],labels=s.index,colors=['r','g','b','y'],autopct='%.2f%%',pctdistance=0.5,\ labeldistance=1.2,shadow=False,startangle=0,radius=1.2,frame=False)
五、直方圖
柱狀圖是用於展示數值的,而直方圖是用來統計頻率的。
hist(x, bins=None, range=None, density=None, weights=None,cumulative=False, bottom=None, histtype='bar', align='mid',orientation='vertical', rwidth=None,
log=False, color=None,label=None, stacked=False, normed=None, *, data=None,**kwargs)
- bins柱子的數量,即將樣本分為多少個組進行統計
- histtype:直方圖的風格,默認為bar,其他還有step、stepfilled、barstacked(有時候對於df不起作用,堆疊直方圖一般不用s.hist())
- align:對齊方式,默認為mid居中對齊,其他還有left和right
- orientation:方向,默認為vertical豎直方向,其他horizontal
- mormed:密度,默認為False,y軸顯示數量,True表示y軸顯示為0-1的區間,與密度圖類似
- grid:直方圖默認有網格
fig,axes = plt.subplots(1,2,figsize=(10,5)) s = pd.Series(np.random.randn(1000)) s.hist(bins=20,histtype='bar',align='right',orientation='vertical',alpha=0.8,density=False,grid=True,ax=axes[0])#四種方式 # s.plot(kind='hist') # s.plot.hist() # plt.hist(s,bins=30) s.hist(bins=20,alpha=0.8,density=True,ax=axes[1]) #直方圖形式的密度圖 s.plot(kind='kde',ax=axes[1] )#密度圖
堆疊直方圖,由於直方圖的histtype設置為batstacked經常不生效,生成多系列的堆疊直方圖常使用df.plot()或df.plot.hist()來生成
df = pd.DataFrame({'A':np.random.randn(1000),'B':np.random.randn(1000),'C':np.random.randn(1000)}) df.plot.hist(stacked=True) # df.plot(kind='hist',stacked=True) # df.hist(stacked=True,histtype='barstacked') #不起作用,生成3個獨立的直方圖 # plt.hist(df) #無法使用
六、散點圖
plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs) # x和y分別表示x軸和y軸數據 # s表示點的大小,可以為一個數值,也可為一變量,為變量則s可表示除x和y的另一個維度 # c表示點的顏色,可以為一具體顏色,也可為一變量,為變量則c可表示除x和y的另一個維度
# vmin和vmax表示亮度的最小和最大值,是一個具體的數值
plt.figure(figsize=(8,5)) x = np.random.randn(1000) y = np.random.randn(1000) plt.scatter(x,y,s =np.random.randn(1000)*30,c=np.random.randn(1000)*30,cmap='Reds') #只有這一種方法
矩陣散點圖是pandas中的方法,不是matplotlib中的方法,常用來看各個指標之間的關系。
df = pd.DataFrame(np.random.randn(100,3),columns = ['A','B','C']) pd.plotting.scatter_matrix(df,figsize=(8,8),diagonal='kde',marker='o',range_padding=0.1) # 將df的三列進行兩兩對比,尋找任意兩個之間的關系 # diagonal為對角線處的圖表顯示類型,即每一列自身,常用bar或kde # range_padding為圖表與x軸和y軸之間的空白
七.極坐標圖
極坐標圖是以一個圓盤進行顯示的,起點為右側水平方向的半徑,距離起點的角度相當於x軸,距離圓心的距離相當於y軸。

s = pd.Series(np.arange(20)) arr = np.arange(0,2*np.pi,00.2) fig = plt.figure(figsize=(10,5)) ax1 = plt.subplot(121,polar = True) # ax1 = fig.add_subplot(121,projection='polar') #polar的兩種參數寫法等價,表示創建極坐標 ax2 = plt.subplot(122) ax1.plot(s,linestyle='--',marker='o') ax1.plot(arr,arr*3,linestyle='--',marker='.',color = 'r',lw=1) ax2.plot(s,linestyle='--',marker='o') ax2.plot(arr,arr*3,linestyle='--',marker='.',color = 'r',lw=1)
下面以兩個對比的例子解釋極坐標的相關參數

arr = np.arange(0,2*np.pi,00.2) fig = plt.figure(figsize = (10,5)) ax1 = fig.add_subplot(121,polar=True) ax2 = fig.add_subplot(122,polar=True) ax1.plot(arr,arr*2,linestyle='--',lw=2) ax2.plot(arr,arr*2,linestyle='--',lw=2) ax2.set_title('ax2') #設置標題 ax2.set_theta_direction(-1) #角度旋轉方向,默認為逆時針,-1表示順時針 ax2.set_thetagrids(np.arange(0,360,90),['a','b','c','d']) #設置極坐標角度網格線(即將圓盤分為幾個扇形)顯示及標簽,標簽默認顯示為角度 ax2.set_rgrids([0,3,6,9,12,15]) #設置網格線顯示(即不同半徑的圓) ax2.set_theta_offset(np.pi/4) #設值網格起點的角度偏移,默認是水平線右側為起點,偏移為逆時針方向偏移 ax2.set_rlim(0,18) #設置網格線的顯示范圍 ax2.set_rmax(18) #設置極坐標的半徑 ax2.set_rticks([0,3,6,9,12,15,18]) #設置網格線的顯示范圍
在極坐標圖中繪制極軸圖

arr = np.arange(0,np.pi*2,np.pi*0.2) data1 = np.random.randint(1,10,10) fig = plt.figure(figsize = (10,6)) ax1 = plt.subplot(111,polar=True) bar = ax1.bar(arr,data1,alpha = 0.7) print(bar,type(bar)) #即一個包含各個扇形的容器,一共10個 # <BarContainer object of 10 artists> <class 'matplotlib.container.BarContainer'>
八、雷達圖
雷達圖可以在極坐標圖的基礎上繪制再填充,也可以直接通過plt.polar()生成。

arr = np.arange(0,np.pi*2,np.pi*0.2) data1 = np.random.randint(1,10,10) data2 = np.random.randint(1,10,10) fig1 = plt.figure(figsize=(10,6)) ax1 = fig1.add_subplot(111,polar = True) ax1.plot(arr,data1,linestyle='--') #繪制極坐標圖,首尾不相連,是折線圖 ax1.fill(arr,data1,alpha=0.7) #將折線圖內部填充顏色,看起來就像是首尾相連,但其實首尾之間並沒有連接的線 ax1.plot(arr,data2,linestyle='--') ax1.fill(arr,data2,alpha=0.7) arr = np.concatenate((arr,[arr[0]])) #將原數據與原數據中的第一個值進行拼接 data1 = np.concatenate((data1,[data1[0]])) #將原數據與原數據中的第一個值進行拼接 fig2 = plt.figure(figsize=(10,6)) plt.polar(arr,data1,'--') #直接通過plt.polar繪制,結果是一個首尾相連的圖 plt.fill(arr,data1,alpha = 0.7) #填充內部
九、箱型圖
箱形圖又稱為盒須圖、盒式圖或箱線圖,是一種用於顯示一組數據分散情況資料的統計圖。
箱型圖包含一組數據的最大值(上內限)、最小值(下內限)、中位數、上四分位數、下四分位數和異常值,計算時將數據按照從大到小的順序排列。
計算四分位的位置有(n+1) / 4和(n-1) / 4兩種,一般采用前者。
- 上四分位數:Q3,位置(n+1) / 4,
- 中位數:位置(n+1)/2
- 下四分位數:Q1,位置3*(n+1) / 4,四分位差為上四分位數-下四分位數,即IQR=Q3-Q1
- 內限:箱型圖的盒須,上內限最大值為Q3+1.5IQR,下內限最小值為Q1-1.5IQR
- 外限:上外限最大值為Q3+3IQR,下外限最小值為Q1-3IQR
- 異常值:上線內限之間的為正常值,上下內限之外、外限之內的為中度異常值,默認用空心圓表示,上下外限之外的為極度異常值,默認用實心圓表示。
boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None,
usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None,
boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None,
manage_ticks=True, autorange=False, zorder=None, *, data=None)
具體參數使用可參考:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.boxplot.html

fig,axes = plt.subplots(1,2,figsize=(10,6)) df = pd.DataFrame(np.random.rand(10,5),columns=['A','B','C','D','E']) color = dict(boxes = 'DarkGreen',whiskers = 'DarkOrange',medians = 'DarkBlue',caps = 'Gray') df.plot.box(ax = axes[0],color = color,grid = True) df.plot(kind='box',ax = axes[1],color = color,vert = False,positions = [1,2,5,4,6])#position表示五列分別位於y軸上1、2、5、4、6的位置上 figure = plt.figure(figsize=(10,6)) f = df.boxplot(vert = True, #是否垂直,默認為True sym = 'o', #異常點形狀,參考marker whis = 1.5, # patch_artist = True, #上下四分位框內是否填充 showmeans = True, #是否顯示均值 meanline = False, #如果顯示均值采用何種形狀,True是虛線,False則為三角形 showbox = True, #是否顯示箱線 showcaps = True, #是否顯示邊緣線,即上內限和下內限 showfliers = True, #是否顯示異常值 notch = False, #中間箱體是否缺口 # return_type = 'dict' #返回類型為字典 ) # plt.boxplot(df) boxplot()另一種使用方法
其中whis表示設置上、下內限時Q3-Q1的比例,默認為1.5,也可以設置一個區間例如[5,95]
df.boxplot()的執行結果默認返回一個<class 'matplotlib.axes._subplots.AxesSubplot'>,參數return_type = 'dict'表示返回一個字典,字典的key包括了boxes箱線、medians中位線、whiskers從box到上下內限的豎線、fliers異常值、caps上下內限的線、means均值線。設置返回字典是為了方便后續對圖表進行顯示設置,假設設置了返回類型為字典,后續對中位線操作for m in f['medians']:m.set(color='y',linewidth = 3),可在圖表生成后調整整個圖表的顯示屬性。
上述示例是對df的每一列分別進行了統計,箱線圖也可以實現對列進行分組然后統計。

df = pd.DataFrame(np.random.rand(10,2),columns=['A','B']) df['C'] = pd.Series(['x','x','y','x','x','y','y','y','x','x']) df['D'] = pd.Series(['x','y','y','x','x','y','y','y','x','y']) f1 = df.boxplot(by = 'C',return_type = 'dict') #按照C列分組然后統計,D列不為數值統計時忽略 f2 = df.boxplot(by = ['C','D'],column = 'A',return_type = 'dict') #按照C列和D列分組然后統計,只統計A列
官方教程參考:https://matplotlib.org/api/pyplot_api.html