matplotlib多子圖實(shí)現(xiàn)共享坐標(biāo)軸的示例詳解
共用坐標(biāo)
當(dāng)一個(gè)圖像中有多個(gè)子圖時(shí),若這些子圖坐標(biāo)的含義相同,那么省略一些坐標(biāo)可以讓圖像更加簡(jiǎn)潔。在matplotlib中,通過(guò)sharex或者sharey可以起到共享x或y軸坐標(biāo)的作用。示例如下
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5,5,100)
ys = [np.sin(x+i) for i in range(5)]
fig,axes = plt.subplots(2,2,sharex=True, sharey=True)
axes = axes.reshape(-1)
for i in range(4):
axes[i].plot(x, ys[i])
plt.show()
效果如下,左上角的子圖沒(méi)有x刻度值,右下角則沒(méi)有y刻度值,右上角則什么坐標(biāo)軸也沒(méi)有。

添加共享軸
直接通過(guò)subplots來(lái)創(chuàng)建圖窗和坐標(biāo)軸,盡管用一行代碼解決了很多問(wèn)題,但相應(yīng)地也不夠靈活,而靈活添加坐標(biāo)軸的函數(shù)add_subplot也有sharex和sharey的參數(shù),但二者并不是布爾型參數(shù),而是需要輸入希望共享的坐標(biāo)軸。
fig = plt.figure() ax3 = fig.add_subplot(223) ax3.plot(x,ys[2]) ax1 = fig.add_subplot(221, sharex=ax3) ax1.plot(x[:50],ys[0][:50]) ax4 = fig.add_subplot(224, sharey=ax3) ax4.plot(x[50:],ys[3][50:]) ax2 = fig.add_subplot(222, sharex=ax4, sharey=ax1) ax2.plot(x,ys[1]) plt.show()
效果如下,一方面,從各坐標(biāo)軸的坐標(biāo)來(lái)看,的確實(shí)現(xiàn)了坐標(biāo)共享,但并沒(méi)有像subplots中一樣,直接隱藏不必要的坐標(biāo)刻度。

為了達(dá)到和subplots相同的效果,需要手動(dòng)隱藏坐標(biāo)刻度,如將代碼改為下面的形式,即可實(shí)現(xiàn)目標(biāo)
fig = plt.figure() ax3 = fig.add_subplot(223) ax3.plot(x,ys[2]) ax1 = fig.add_subplot(221, sharex=ax3) ax1.plot(x[:50],ys[0][:50]) ax1.tick_params(axis="x", labelbottom=False) ax4 = fig.add_subplot(224, sharey=ax3) ax4.plot(x[50:],ys[3][50:]) ax4.tick_params(axis="y", labelleft=False) ax2 = fig.add_subplot(222, sharex=ax4, sharey=ax1) ax2.plot(x,ys[1]) ax2.tick_params(axis="x", labelbottom=False) ax2.tick_params(axis="y", labelleft=False) plt.show()
灰度直方圖
上面示例中那幾個(gè)子圖,彼此之間區(qū)別不大,放在一張圖中是完全沒(méi)問(wèn)題的,但有些情況則不適合放在一張圖中,比如對(duì)于一張圖片來(lái)說(shuō),想知道其水平方向上灰度強(qiáng)度的分布,就比較適合坐標(biāo)。
path = r'lena.jpg'
img = plt.imread(path)
xs = [np.sum(img[:,:,i],0) for i in range(3)]
ys = [np.sum(img[:,:,i],1) for i in range(3)]
fig = plt.figure()
gs = fig.add_gridspec(2, 2,
width_ratios=(4, 1),
height_ratios=(1, 4))
ax = fig.add_subplot(gs[1, 0])
ax.imshow(img) # 散點(diǎn)圖繪制
plt.axis('off')
xHist = fig.add_subplot(gs[0, 0], sharex=ax)
xHist.tick_params(axis="x", labelbottom=False)
yHist = fig.add_subplot(gs[1, 1], sharey=ax)
yHist.tick_params(axis="y", labelleft=False)
colors = 'rgb'
for i in range(3):
xHist.plot(xs[i], color=colors[i])
yHist.plot(ys[i], np.arange(len(ys[i])),color=colors[i])
plt.show()
由于lena圖有3個(gè)通道,所以在對(duì)每行或者每列像素求和時(shí),選擇分別對(duì)三個(gè)通道進(jìn)行操作。而后在繪制曲線時(shí),對(duì)三個(gè)通道的值也使用了不同的顏色方案。通過(guò)tick_params函數(shù),取消了上圖底部和右圖左側(cè)的坐標(biāo)刻度。
最后得圖如下

到此這篇關(guān)于matplotlib多子圖實(shí)現(xiàn)共享坐標(biāo)軸的示例詳解的文章就介紹到這了,更多相關(guān)matplotlib共享坐標(biāo)軸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲(chóng)Requests庫(kù)的使用詳情
這篇文章主要介紹了Python爬蟲(chóng)Requests庫(kù)的使用詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
python3+PyQt5實(shí)現(xiàn)自定義分?jǐn)?shù)滑塊部件
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5實(shí)現(xiàn)自定義分?jǐn)?shù)滑塊部件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
python并發(fā)2之使用asyncio處理并發(fā)
本篇文章主要介紹了python并發(fā)2之使用asyncio處理并發(fā),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Python中實(shí)現(xiàn)JSON數(shù)據(jù)讀寫(xiě)的編程實(shí)戰(zhàn)指南
JSON 全稱是 JavaScript Object Notation 即 JavaScript 對(duì)象表示法,是一種輕量級(jí)的數(shù)據(jù)交換格式,下面就帶大家深入理解 JSON 的概念以及在 Python 中的讀寫(xiě)操作方法吧2025-11-11
33個(gè)Python爬蟲(chóng)項(xiàng)目實(shí)戰(zhàn)(推薦)
這篇文章主要介紹了33個(gè)Python爬蟲(chóng)項(xiàng)目實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
NumPy中np.c_ 和 np.r_ 的區(qū)別小結(jié)
np.c_和?np.r_是NumPy庫(kù)中兩個(gè)非常有用的函數(shù),它們分別用于按列和按行拼接數(shù)組本文主要介紹了NumPy中np.c_ 和 np.r_ 的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02

