溫馨提示×

溫馨提示×

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

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

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

發(fā)布時(shí)間:2022-08-01 09:22:29 來源:億速云 閱讀:172 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Python Matplotlib如何通過plt.subplots創(chuàng)建子繪圖”,在日常操作中,相信很多人在Python Matplotlib如何通過plt.subplots創(chuàng)建子繪圖問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python Matplotlib如何通過plt.subplots創(chuàng)建子繪圖”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

前言

plt.subplots調(diào)用后將會產(chǎn)生一個(gè)圖表(Figure)和默認(rèn)網(wǎng)格(Grid),與此同時(shí)提供一個(gè)合理的控制策略布局子繪圖。

一、只有子圖的繪制

如果沒有提供參數(shù)給subplots將會返回:

Figure一個(gè)Axes對象

例子:

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('A single plot')

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

二、單個(gè)方向堆疊子圖

堆疊子圖就需要用到額外的可選參數(shù),分別是子圖的行和列數(shù),如果你只傳遞一個(gè)數(shù)字,默認(rèn)列數(shù)為1,行堆疊。

比如:

fig, axs = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
axs[0].plot(x, y)
axs[1].plot(x, -y)

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

當(dāng)然如果你的子圖比較少,可以考慮用元組接收axes對象:

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
ax1.plot(x, y)
ax2.plot(x, -y)

如果想要按照行排列,將參數(shù)改成(1,2)即可。

三、行列方向擴(kuò)展子圖

如果行列擴(kuò)展子圖,那么axes返回的則是一個(gè)二維Numpy數(shù)組。利用axe的flat屬性,可以批量對軸進(jìn)行賦值。

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title('Axis [0, 0]')# 等價(jià)于axes[0][0]
axs[0, 1].plot(x, y, 'tab:orange')
axs[0, 1].set_title('Axis [0, 1]')
axs[1, 0].plot(x, -y, 'tab:green')
axs[1, 0].set_title('Axis [1, 0]')
axs[1, 1].plot(x, -y, 'tab:red')
axs[1, 1].set_title('Axis [1, 1]')

for ax in axs.flat:
    ax.set(xlabel='x-label', ylabel='y-label')

# Hide x labels and tick labels for top plots and y ticks for right plots.
for ax in axs.flat:
    ax.label_outer()

當(dāng)然你可以用單個(gè)軸對象接收:

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x, -y, 'tab:green')
ax4.plot(x, -y**2, 'tab:red')

for ax in fig.get_axes():
    ax.label_outer()

四、共享軸

默認(rèn)情況下,每個(gè)子圖都是獨(dú)立創(chuàng)建的。

看下面這個(gè)例子:

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Axes values are scaled individually by default')
ax1.plot(x, y)
ax2.plot(x + 1, -y)

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

可以看出兩者的橫坐標(biāo)刻度并不對齊,那么應(yīng)該如何設(shè)置共享?答:在subplot創(chuàng)建之時(shí)使用sharex=Truesharedy=True分別創(chuàng)建X軸共享或者Y軸共享。

將上邊的例子修改為以下:

fig, (ax1, ax2) = plt.subplots(2, sharex=True)
fig.suptitle('Aligning x-axis using sharex')
ax1.plot(x, y)
ax2.plot(x + 1, -y)

結(jié)果如下:

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

OK,看上去確實(shí)統(tǒng)一了坐標(biāo)軸,除此,python幫你移除了多余的坐標(biāo)刻度,上面中間的刻度被刪除了。

如果你覺得中間的留白不太舒服的話,也有辦法去除。方法是通過GridSpec對象,但是使用上就比較麻煩了,因?yàn)槟阈枰约簞?chuàng)建一個(gè)figure并使用add_gridspec返回這個(gè)對象,然后再通過subplot進(jìn)行接下來的操作。

直接看例子吧:

fig = plt.figure()
gs = fig.add_gridspec(3, hspace=0)
axs = gs.subplots(sharex=True, sharey=True)
fig.suptitle('Sharing both axes')
axs[0].plot(x, y ** 2)
axs[1].plot(x, 0.3 * y, 'o')
axs[2].plot(x, y, '+')

# Hide x labels and tick labels for all but bottom plot.
for ax in axs:
    ax.label_outer()

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

這里還用到了軸的label_outer方法,這是用來隱藏非邊界的坐標(biāo)軸的?!皊hare”在這里的意思是:共享一個(gè)坐標(biāo)軸,也就意味著刻度的位置是對齊的。

請注意,修改sharex和sharey是全局修改的,所以你如果想讓每一行和每一列共享一個(gè)坐標(biāo)軸,可以考慮用sharex='col', sharey='row'

fig = plt.figure()
gs = fig.add_gridspec(2, 2, hspace=0, wspace=0)
(ax1, ax2), (ax3, ax4) = gs.subplots(sharex='col', sharey='row')
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x + 1, -y, 'tab:green')
ax4.plot(x + 2, -y**2, 'tab:red')

for ax in axs.flat:
    ax.label_outer()

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

如果你需要關(guān)聯(lián)更加復(fù)雜的共享軸關(guān)系,可以創(chuàng)建出來使用axe的成員sharex、sharey進(jìn)行設(shè)置:

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title("main")
axs[1, 0].plot(x, y**2)
axs[1, 0].set_title("shares x with main")
axs[1, 0].sharex(axs[0, 0])
axs[0, 1].plot(x + 1, y + 1)
axs[0, 1].set_title("unrelated")
axs[1, 1].plot(x + 2, y + 2)
axs[1, 1].set_title("also unrelated")
fig.tight_layout()# 讓繪圖更加緊湊

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

五、極坐標(biāo)子圖

fig, (ax1, ax2) = plt.subplots(1, 2, subplot_kw=dict(projection='polar'))
ax1.plot(x, y)
ax2.plot(x, y ** 2)
plt.show()

Python?Matplotlib如何通過plt.subplots創(chuàng)建子繪圖

到此,關(guān)于“Python Matplotlib如何通過plt.subplots創(chuàng)建子繪圖”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

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

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

AI