matplotlib柱狀圖、面積圖、直方圖、散點圖、極坐標圖、箱型圖


一、柱狀圖

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM