溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Matplotlib庫(kù)基礎(chǔ)中如何自動(dòng)調(diào)整函數(shù)

發(fā)布時(shí)間:2021-10-26 10:58:33 來(lái)源:億速云 閱讀:171 作者:柒染 欄目:編程語(yǔ)言

這篇文章給大家介紹Matplotlib庫(kù)基礎(chǔ)中如何自動(dòng)調(diào)整函數(shù),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

在matplotlib中,軸Axes的位置以標(biāo)準(zhǔn)化圖形坐標(biāo)指定,可能發(fā)生的情況是軸標(biāo)簽、標(biāo)題、刻度標(biāo)簽等等會(huì)超出圖形區(qū)域,導(dǎo)致顯示不全。Matplotlib v1.1 引入了一個(gè)新的命令tight_layout(),作用是自動(dòng)調(diào)整子圖參數(shù),使之填充整個(gè)圖像區(qū)域。

調(diào)用plt.show()函數(shù)時(shí)會(huì)自動(dòng)運(yùn)行tight_layout()函數(shù),如下所示:

def show(self):
 self.figure.tight_layout()
 FigureCanvasAgg.draw(self)
 if PORT is None:
 return
 if matplotlib.__version__ < '1.2':
 buffer = self.tostring_rgb(0, 0)
 else:
 buffer = self.tostring_rgb()
 if len(set(buffer)) <= 1:
 # do not plot empty
 return
 render = self.get_renderer()
 width = int(render.width)
 plot_index = index if os.getenv("PYCHARM_MATPLOTLIB_INTERACTIVE", False) else -1
 try:
 sock = socket.socket()
 sock.connect((HOST, PORT))
 sock.send(struct.pack('>i', width))
 sock.send(struct.pack('>i', plot_index))
 sock.send(struct.pack('>i', len(buffer)))
 sock.send(buffer)
 except OSError as _:
 # nothing bad. It just means, that our tool window doesn't run yet
 pass

我們通過(guò)以下一個(gè)例程來(lái)介紹,最終的顯示效果如下所示:

fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
ax1.plot(np.arange(10), np.random.randint(0, 10, 10), ls='-', c='r', lw=1)
ax2.plot(np.arange(10), np.random.randint(10, 20, 10), ls='-', c='y', lw=1)
plt.show()

Matplotlib庫(kù)基礎(chǔ)中如何自動(dòng)調(diào)整函數(shù)

不過(guò)很多時(shí)候會(huì)出現(xiàn)tight_layout()不工作的情況,比如出現(xiàn)以下提示:
UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect. warnings.warn("This figure includes Axes that are not compatible "
這個(gè)警告的原因是tight_layout這個(gè)函數(shù)出錯(cuò)了,警告語(yǔ)句出現(xiàn)的原因時(shí)axes列表為空,tight_layout()中相應(yīng)的代碼,如下所示:

subplotspec_list = get_subplotspec_list(self.axes)
if None in subplotspec_list:
 cbook._warn_external("This figure includes Axes that are not "
 "compatible with tight_layout, so results "
 "might be incorrect.")

可見(jiàn)這個(gè)函數(shù)并不太穩(wěn)定。tight_layout不起作用的時(shí)候,繪圖效果如下所示,可見(jiàn)子圖并沒(méi)有填充整個(gè)圖像區(qū)域。

Matplotlib庫(kù)基礎(chǔ)中如何自動(dòng)調(diào)整函數(shù)

網(wǎng)上搜索了下發(fā)現(xiàn)也有類似的情況出現(xiàn),附上部分案例的截圖:

Matplotlib庫(kù)基礎(chǔ)中如何自動(dòng)調(diào)整函數(shù)

接下來(lái)我們嘗試下解決方法,tight_layout在plt.savefig的調(diào)用方式相對(duì)比較穩(wěn)定,我們將plt.show()函數(shù)替換為plt.savefig函數(shù),替換后會(huì)在本地另外為png圖片,該圖片中子圖填充了整個(gè)圖像區(qū)域。

plt.savefig('fig.png', bbox_inches='tight') # 替換 plt.show()

關(guān)于Matplotlib庫(kù)基礎(chǔ)中如何自動(dòng)調(diào)整函數(shù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI