日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

一文教會(huì)你調(diào)整Matplotlib子圖的大小_python

作者:小小的香辛料 ? 更新時(shí)間: 2022-08-23 編程語(yǔ)言

前段時(shí)間就遇到了這個(gè)問(wèn)題,一直忘了寫,今晚夜深人靜總結(jié)一波~

問(wèn)題

我相信,看到這篇博客的人,你肯定已經(jīng)會(huì)使用Matplotlib中的pyplot畫圖。?

比如下面這種圖

?你也應(yīng)該會(huì)調(diào)整單個(gè)圖的大小了,就是使用如下語(yǔ)句控制單個(gè)圖形figure的大小,比如我這里設(shè)的8*6的。

fig3 = plt.figure(figsize=(8,6))

但隨著繼續(xù)深入的學(xué)習(xí),有時(shí)我們很有必要將兩個(gè)圖畫在一起,來(lái)做對(duì)比,所以你也應(yīng)該會(huì)在一個(gè)畫布上畫多個(gè)子圖了。比如下圖

?即是通過(guò)subplot實(shí)現(xiàn)

#展示一下數(shù)據(jù)
fig = plt.figure(figsize=(15,7))
 
fig1 = plt.subplot(231)
plt.scatter(data.loc[:,'Avg. Area Income'],data.loc[:,'Price'])
plt.title('Income VS Price')
 
fig2 = plt.subplot(232)
plt.scatter(data.loc[:,'Avg. Area House Age'],data.loc[:,'Price'])
plt.title('Age VS Price')
 
fig3 = plt.subplot(233)
plt.scatter(data.loc[:,'Avg. Area Number of Rooms'],data.loc[:,'Price'])
plt.title('Number VS Price')
 
fig4 = plt.subplot(234)
plt.scatter(data.loc[:,'Area Population'],data.loc[:,'Price'])
plt.title('Population VS Price')
 
fig5 = plt.subplot(235)
plt.scatter(data.loc[:,'size'],data.loc[:,'Price'])
plt.title('size VS Price')
plt.show()

?目前為止圖好像沒(méi)有問(wèn)題,那問(wèn)題在哪呢?就是在子圖比較少的時(shí)候,整個(gè)圖可能會(huì)變形,出現(xiàn)下圖情況。

這顯然不是我們期望的,我們希望他不要拉長(zhǎng)。但是貌似直接通過(guò)subplot畫出的子圖無(wú)法更改大小,網(wǎng)上給的一些方案也比較麻煩。

簡(jiǎn)便的解決方法

?把這兩個(gè)子圖畫在同一個(gè)畫布里,這樣即是子圖無(wú)法改變,但是外面的畫布大小可以改變,子圖就可以根據(jù)外面畫布大小自適應(yīng)的顯示了。

對(duì)于該圖

?其原始代碼為

fig6 = plt.subplot(121)
label0 = plt.scatter(X.loc[:,'V1'][y_corrected==0],X.loc[:,'V2'][y_corrected==0])
label1 = plt.scatter(X.loc[:,'V1'][y_corrected==1],X.loc[:,'V2'][y_corrected==1])
label2 = plt.scatter(X.loc[:,'V1'][y_corrected==2],X.loc[:,'V2'][y_corrected==2])
 
plt.title("corrected data")
plt.xlabel('V1')
plt.ylabel('V2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])
 
fig7 = plt.subplot(122)
label0 = plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1 = plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2 = plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
 
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('V2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])
plt.show()

?可以看到兩個(gè)子圖fig6和fig7都是直接使用subplot得到的,所以它變形了。

修改后應(yīng)該是這樣的:

對(duì)應(yīng)代碼 :

fig = plt.figure(figsize=(11,4))
fig6 = plt.subplot(121)
label0 = plt.scatter(X.loc[:,'V1'][y_corrected==0],X.loc[:,'V2'][y_corrected==0])
label1 = plt.scatter(X.loc[:,'V1'][y_corrected==1],X.loc[:,'V2'][y_corrected==1])
label2 = plt.scatter(X.loc[:,'V1'][y_corrected==2],X.loc[:,'V2'][y_corrected==2])
 
plt.title("corrected data")
plt.xlabel('V1')
plt.ylabel('V2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])
 
fig7 = plt.subplot(122)
label0 = plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1 = plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2 = plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
 
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('V2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])
plt.show()

?相比原來(lái)的代碼就多了第一行的操作,定一個(gè)合適畫布的大小就可以方便動(dòng)態(tài)調(diào)整子圖了。

麻煩點(diǎn)的方法

?看到網(wǎng)上是有可以自定義子圖大小的方法的,不過(guò)相比我想出來(lái)的這個(gè)方法,感覺(jué)太麻煩了。這個(gè)方法能解決我這一類問(wèn)題了,如果后面遇到需要一個(gè)子圖大一個(gè)子圖小的問(wèn)題再單獨(dú)記錄把。

總結(jié)

原文鏈接:https://blog.csdn.net/doubleguy/article/details/120008554

欄目分類
最近更新