簡體   English   中英

跨 gridspec 子圖/軸共享 xlabel(部分行)

[英]sharing of xlabel across gridspec subplots/axes (partial row)

我在三個子圖中共享一個居中的 xlabel 時遇到一些間歇性問題,這些子圖 1)僅跨越 gridspec 行的一部分,2)相對於彼此的寬度可能會有所不同。

使用文檔我已經能夠整理出我正在尋找的基本多圖結構:

在此處輸入圖像描述

fig = plt.figure(figsize=(10,8), constrained_layout=True)
xlabel_234 = 'XLabel Thing2\n(to be centered under ax2, ax3, and ax4 with equal horiz. spacing btwn subplots)'
gs = fig.add_gridspec(nrows=14, ncols=1)

gs0 = gs[0:2]
gs1 = gs[2:].subgridspec(nrows=1, ncols=12)

ax1 = fig.add_subplot(gs0)
ax1.set_title('Something Short and Wide')
ax1.text(0.5, 0.5, 'ax1', ha='center')
ax1.set_xlabel('XLabel Thing1')

ax2 = fig.add_subplot(gs1[0, 0:1])
ax2.set_title('Something Tall\nand Narrow 2a')
ax2.text(0.5, 0.5, 'ax2', ha='center')

ax3 = fig.add_subplot(gs1[0, 1:6], sharey=ax2)
ax3.set_title('Something Tall\nand Narrow 2b')
ax3.text(0.5, 0.5, 'ax3', ha='center')
plt.setp(ax3.get_yticklabels(), visible=False)
ax3.set_xlabel(xlabel_234, x=0.7)   # *x offset is a bit of hack*

ax4 = fig.add_subplot(gs1[0, 6:9], sharey=ax2)
ax4.set_title('Something Tall\n and Narrow 2c')
ax4.text(0.5, 0.5, 'ax4', ha='center')
plt.setp(ax4.get_yticklabels(), visible=False)

ax5 = fig.add_subplot(gs1[0, 9:12])
ax5.set_title('Something Tall\nand Narrow 3')
ax5.text(0.5, 0.5, 'ax5', ha='center')
ax5.set_xlabel('XLabel Thing3')

我想認出這篇文章來幫助我整理 y 軸共享。 setp 中的可見性 kwarg 是一個巨大的幫助。

這篇文章幫助我(有點)獲得了一個常見的 xlabel 居中,但它有點像 hack,並且可能會根據 ax2、ax3、ax4 的相對寬度產生一些奇怪的行為(影響間距)。 而且我必須迭代地猜測 x 偏移值。

我有更精確的方法嗎? 而且,也許,標准化 xtick label 格式(我知道如何一次性完成)。 就像可能是 subgridspec-of-the-subgridspec? 或者,其他文檔顯示“width_ratios”kwarg(盡管沒有太多關於實施的信息)......這會是更好的方法嗎(即子圖間距可能不那么敏感)? 其他?

干杯

最近的一些功能(matplotlib 3.4.0+)可以在這里提供幫助:

您可以使用這些以各種方式重現您的布局,但這里有一個示例供參考:

  1. 創建頂部/底部子圖(頂級subfig ax0
  2. 在底部子圖,窩左/右子圖(左subfig ax1 - ax3 ,右subfig ax4
  3. 在左下角的子圖中,使用自定義gridspecsupxlabel (用於ax1 - ax3
fig = plt.figure(constrained_layout=True, figsize=(10, 8))

# create top/bottom subfigs
(subfig_t, subfig_b) = fig.subfigures(2, 1, hspace=0.05, height_ratios=[1, 3])

# put ax0 in top subfig
ax0 = subfig_t.subplots()
ax0.set_title('ax0')
subfig_t.supxlabel('xlabel0')

# create left/right subfigs nested in bottom subfig
(subfig_bl, subfig_br) = subfig_b.subfigures(1, 2, wspace=0.1, width_ratios=[3, 1])

# put ax1-ax3 in gridspec of bottom-left subfig
gs = subfig_bl.add_gridspec(nrows=1, ncols=9)
ax1 = subfig_bl.add_subplot(gs[0, :1])
ax2 = subfig_bl.add_subplot(gs[0, 1:6], sharey=ax1)
ax3 = subfig_bl.add_subplot(gs[0, 6:], sharey=ax1)
ax1.set_title('ax1')
ax2.set_title('ax2')
ax3.set_title('ax3')
ax2.get_yaxis().set_visible(False)
ax3.get_yaxis().set_visible(False)
subfig_bl.supxlabel('xlabel1-3')

# put ax4 in bottom-right subfig
ax4 = subfig_br.subplots()
ax4.set_title('ax4')
subfig_br.supxlabel('xlabel4')

帶有 supxlabel 的嵌套子圖

我們如何將這段代碼拆分為單獨的函數。 我嘗試這樣做,但無法在正確的位置獲得帶有圖形的完整圖形。 示例:一個 Function 正在調用 func 1、2、3 到 plot 並保存圖,考慮到:

  • 功能 1 管理:

     # put ax0 in top subfig ax0 = subfig_t.subplots() ax0.set_title('ax0') subfig_t.supxlabel('xlabel0')
  • 功能 2 管理:

     # put ax1-ax3 in gridspec of bottom-left subfig gs = subfig_bl.add_gridspec(nrows=1, ncols=9) ax1 = subfig_bl.add_subplot(gs[0,:1]) ax2 = subfig_bl.add_subplot(gs[0, 1:6], sharey=ax1) ax3 = subfig_bl.add_subplot(gs[0, 6:], sharey=ax1) ax1.set_title('ax1') ax2.set_title('ax2') ax3.set_title('ax3') ax2.get_yaxis().set_visible(False) ax3.get_yaxis().set_visible(False) subfig_bl.supxlabel('xlabel1-3')
  • function 3:

     # put ax4 in bottom-right subfig ax4 = subfig_br.subplots() ax4.set_title('ax4') subfig_br.supxlabel('xlabel4')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM