Matplotlib 中文用戶指南 3.4 密致布局指南

密致布局指南

原文:Tight Layout guide

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

tight_layout會(huì)自動(dòng)調(diào)整子圖參數(shù)堪伍,使之填充整個(gè)圖像區(qū)域觅闽。這是個(gè)實(shí)驗(yàn)特性谱煤,可能在一些情況下不工作刘离。它僅僅檢查坐標(biāo)軸標(biāo)簽、刻度標(biāo)簽以及標(biāo)題的部分茧痕。

簡(jiǎn)單的示例

在 matplotlib 中恼除,軸域(包括子圖)的位置以標(biāo)準(zhǔn)化圖形坐標(biāo)指定。 可能發(fā)生的是舀患,你的軸標(biāo)簽或標(biāo)題(有時(shí)甚至是刻度標(biāo)簽)會(huì)超出圖形區(qū)域气破,因此被截?cái)唷?/p>

plt.rcParams['savefig.facecolor'] = "0.8"

def example_plot(ax, fontsize=12):
     ax.plot([1, 2])
     ax.locator_params(nbins=3)
     ax.set_xlabel('x-label', fontsize=fontsize)
     ax.set_ylabel('y-label', fontsize=fontsize)
     ax.set_title('Title', fontsize=fontsize)

plt.close('all')
fig, ax = plt.subplots()
example_plot(ax, fontsize=24)

為了避免它低匙,軸域的位置需要調(diào)整碳锈。對(duì)于子圖售碳,這可以通過(guò)調(diào)整子圖參數(shù)(移動(dòng)軸域的一條邊來(lái)給刻度標(biāo)簽騰地方)。Matplotlib v1.1 引入了一個(gè)新的命令tight_layout()竿屹,自動(dòng)為你解決這個(gè)問(wèn)題。

plt.tight_layout()

當(dāng)你擁有多個(gè)子圖時(shí)力惯,你會(huì)經(jīng)痴偎唬看到不同軸域的標(biāo)簽疊在一起弄跌。

plt.close('all')
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)

tight_layout()也會(huì)調(diào)整子圖之間的間隔來(lái)減少堆疊铛只。

tight_layout()可以接受關(guān)鍵字參數(shù)pad淳玩、w_pad或者h_pad蜕着,這些參數(shù)圖像邊界和子圖之間的額外邊距。邊距以字體大小單位規(guī)定蓖乘。

plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)

即使子圖大小不同驱敲,tight_layout()也能夠工作,只要網(wǎng)格的規(guī)定的兼容的握牧。在下面的例子中沿腰,ax1ax2是 2x2 網(wǎng)格的子圖狈定,但是ax3是 1x2 網(wǎng)格纽什。

plt.close('all')
fig = plt.figure()

ax1 = plt.subplot(221)
ax2 = plt.subplot(223)
ax3 = plt.subplot(122)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)

plt.tight_layout()

它適用于使用subplot2grid()創(chuàng)建的子圖芦缰。 一般來(lái)說(shuō)让蕾,從gridspec使用GridSpec自定義子布局的位置)創(chuàng)建的子圖也能正常工作。

plt.close('all')
fig = plt.figure()

ax1 = plt.subplot2grid((3, 3), (0, 0))
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
ax4 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)

plt.tight_layout()

雖然沒(méi)有徹底測(cè)試,它看起來(lái)也適用于aspect不為auto的子圖(例如帶有圖像的軸域)顿颅。

arr = np.arange(100).reshape((10,10))

plt.close('all')
fig = plt.figure(figsize=(5,4))

ax = plt.subplot(111)
im = ax.imshow(arr, interpolation="none")

plt.tight_layout()

警告

  • tight_layout()只考慮刻度標(biāo)簽庇配,軸標(biāo)簽和標(biāo)題栖疑。 因此遇革,其他藝術(shù)家可能被截?cái)嗖⑶乙部赡苤丿B揭糕。
  • 它假定刻度標(biāo)簽著角,軸標(biāo)簽和標(biāo)題所需的額外空間與軸域的原始位置無(wú)關(guān)旋恼。 這通常是真的冰更,但在罕見(jiàn)的情況下不是。
  • pad = 0將某些文本剪切幾個(gè)像素舟铜。 這可能是當(dāng)前算法的錯(cuò)誤或限制谆刨,并且不清楚為什么會(huì)發(fā)生归斤。 同時(shí)脏里,推薦使用至少大于 0.3 的間隔。

GridSpec一起使用

GridSpec擁有自己的tight_layout()方法(pyplot API 的tight_layout()也能生效)鸦难。


plt.close('all')
fig = plt.figure()

import matplotlib.gridspec as gridspec

gs1 = gridspec.GridSpec(2, 1)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])

example_plot(ax1)
example_plot(ax2)

gs1.tight_layout(fig)

你可以提供一個(gè)可選的rect參數(shù),指定子圖所填充的邊框介返。 坐標(biāo)必須為標(biāo)準(zhǔn)化圖形坐標(biāo)圣蝎,默認(rèn)值為(0, 0, 1, 1)衡瓶。

gs1.tight_layout(fig, rect=[0, 0, 0.5, 1])

例如哮针,這可用于帶有多個(gè)gridspecs的圖形。

gs2 = gridspec.GridSpec(3, 1)

for ss in gs2:
    ax = fig.add_subplot(ss)
    example_plot(ax)
    ax.set_title("")
    ax.set_xlabel("")

ax.set_xlabel("x-label", fontsize=12)

gs2.tight_layout(fig, rect=[0.5, 0, 1, 1], h_pad=0.5)

我們可以嘗試匹配兩個(gè)網(wǎng)格的頂部和底部捂齐。

top = min(gs1.top, gs2.top)
bottom = max(gs1.bottom, gs2.bottom)

gs1.update(top=top, bottom=bottom)
gs2.update(top=top, bottom=bottom)

雖然這應(yīng)該足夠好了奠宜,調(diào)整頂部和底部可能也需要調(diào)整hspace瞻想。 為了更新hspacevspace蘑险,我們?cè)俅问褂酶潞蟮?code>rect參數(shù)調(diào)用tight_layout()。 注意嘴高,rect參數(shù)指定的區(qū)域包括刻度標(biāo)簽拴驮。因此柴信,我們將底部(正常情況下為 0)增加每個(gè)gridspec的底部之差随常。 頂部也一樣。

top = min(gs1.top, gs2.top)
bottom = max(gs1.bottom, gs2.bottom)

gs1.tight_layout(fig, rect=[None, 0 + (bottom-gs1.bottom),
                            0.5, 1 - (gs1.top-top)])
gs2.tight_layout(fig, rect=[0.5, 0 + (bottom-gs2.bottom),
                            None, 1 - (gs2.top-top)],
                 h_pad=0.5)

AxesGrid1一起使用

雖然受限但也支持axes_grid1工具包

plt.close('all')
fig = plt.figure()

from mpl_toolkits.axes_grid1 import Grid
grid = Grid(fig, rect=111, nrows_ncols=(2,2),
            axes_pad=0.25, label_mode='L',
            )

for ax in grid:
    example_plot(ax)
    ax.title.set_visible(False)

plt.tight_layout()

顏色條

如果你使用colorbar命令創(chuàng)建了顏色條枣察,創(chuàng)建的顏色條是Axes而不是Subplot的實(shí)例,所以tight_layout沒(méi)有效果臂痕。在 Matplotlib v1.1 中握童,你可以使用gridspec將顏色條創(chuàng)建為子圖叛赚。

plt.close('all')
arr = np.arange(100).reshape((10,10))
fig = plt.figure(figsize=(4, 4))
im = plt.imshow(arr, interpolation="none")

plt.colorbar(im, use_gridspec=True)

plt.tight_layout()

![])http://matplotlib.org/_images/tight_layout_guide-14.png

另一個(gè)選項(xiàng)是使用AxesGrid1工具包,顯式為顏色條創(chuàng)建一個(gè)軸域:

plt.close('all')
arr = np.arange(100).reshape((10,10))
fig = plt.figure(figsize=(4, 4))
im = plt.imshow(arr, interpolation="none")

from mpl_toolkits.axes_grid1 import make_axes_locatable
divider = make_axes_locatable(plt.gca())
cax = divider.append_axes("right", "5%", pad="3%")
plt.colorbar(im, cax=cax)

plt.tight_layout()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膨桥,隨后出現(xiàn)的幾起案子唠叛,更是在濱河造成了極大的恐慌艺沼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異藐石,居然都是意外死亡定拟,警方通過(guò)查閱死者的電腦和手機(jī)青自,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門延窜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吗坚,你說(shuō)我怎么就攤上這事呆万∧奔酰” “怎么了扫沼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵严就,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我渐行,道長(zhǎng)铸董,這世上最難降的妖魔是什么祟印? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮粟害,結(jié)果婚禮上蕴忆,老公的妹妹穿的比我還像新娘。我一直安慰自己悲幅,他們只是感情好套鹅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著汰具,像睡著了一般芋哭。 火紅的嫁衣襯著肌膚如雪郁副。 梳的紋絲不亂的頭發(fā)上减牺,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音存谎,去河邊找鬼拔疚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛既荚,可吹牛的內(nèi)容都是我干的稚失。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恰聘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼句各!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起晴叨,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凿宾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后兼蕊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體初厚,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年孙技,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了产禾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排作。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亚情,靈堂內(nèi)的尸體忽然破棺而出妄痪,到底是詐尸還是另有隱情,我是刑警寧澤楞件,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布拌夏,位于F島的核電站,受9級(jí)特大地震影響履因,放射性物質(zhì)發(fā)生泄漏障簿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一栅迄、第九天 我趴在偏房一處隱蔽的房頂上張望站故。 院中可真熱鬧,春花似錦毅舆、人聲如沸西篓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岂津。三九已至,卻和暖如春悦即,著一層夾襖步出監(jiān)牢的瞬間吮成,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工辜梳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粱甫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓作瞄,卻偏偏與公主長(zhǎng)得像茶宵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宗挥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容