使用子图时用完缺少标签留下的 space
Using up space left by a missing label when using subplots
我为题名道歉,但我想不出如何用不同的方式来表达它。下图最能说明问题。如您所见,我使用 matplotlibs gridspec 制作了由 5 个子图组成的图形,它们适合 4 个方形面板。三个空面板有自己的 x 坐标集,需要自己的标签。然而,来自前两个面板的数据共享 X 轴,并且(假设实际标签会很长)我宁愿只有一个标签和一组刻度,如此处所示。
但是正如您所见,这会在两个面板之间留下相当大的白色间隙space,标签本来应该消失的。这就是我想解决的问题;我想等量拉伸两个面板以填满这个白色 space。同时,顶部面板的顶部和底部面板的底部仍应与右侧的子图对齐,并且两个面板的底部不应干扰下方行的位置。我查看了 documentation 中有关调整面板的文档,但我无法弄明白。
顺便说一句,我还想为两个面板设置一个 y 轴标签,但我想我可以用 fig.text()
来捏造它。
生成上述图的代码:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import gridspec
xs = np.linspace(0,8*np.pi,101)
ys = np.cos(xs)
fig = plt.figure(figsize=(7.2,4.45*1.5))
gs1 = gridspec.GridSpec(4, 2, figure=fig)
#gs1.update(hspace=0.1)
ax1 = plt.subplot(gs1[0, 0])
ax1.plot(xs, ys)
#ax1.set_xlabel('X')
ax1.set_ylabel('Y1')
ax1.set_xticks([])
ax2 = plt.subplot(gs1[1, 0])
ax2.plot(xs, 0.5*ys)
ax2.set_xlabel('X')
ax2.set_ylabel('Y2')
ax2.set_ylim(-1,1)
gs2 = gridspec.GridSpec(4, 2)
ax3 = plt.subplot(gs2[0:2, 1])
ax3.set_xlabel('X3')
ax3.set_ylabel('Y3')
ax4 = plt.subplot(gs2[2:, 0])
ax4.set_xlabel('X4')
ax4.set_ylabel('Y4')
ax5 = plt.subplot(gs2[2:, 1])
ax5.set_xlabel('X5')
ax5.set_ylabel('Y5')
plt.tight_layout()
您可以在 2x2 gridspec 的一个象限中使用 SubplotSpec
。
找到一个例子 int gridspec-using-subplotspec.
这里看起来像
import numpy as np
from matplotlib import pyplot as plt
xs = np.linspace(0,8*np.pi,101)
ys = np.cos(xs)
fig = plt.figure(figsize=(7.2,4.45*1.5))
# 2x2 "outer" GridSpec
gs = fig.add_gridspec(2, 2)
# 2x1 "inner" GridSpec to be used
# in one cell of the outer grid
gs00 = gs[0,0].subgridspec(2, 1)
ax1 = fig.add_subplot(gs00[0])
ax1.plot(xs, ys)
ax1.set_ylabel('Y1')
ax1.set_xticks([])
ax2 = fig.add_subplot(gs00[1])
ax2.plot(xs, 0.5*ys)
ax2.set_xlabel('X')
ax2.set_ylabel('Y2')
ax2.set_ylim(-1,1)
ax3 = fig.add_subplot(gs[0,1])
ax3.set_xlabel('X3')
ax3.set_ylabel('Y3')
ax4 = fig.add_subplot(gs[1,0])
ax4.set_xlabel('X4')
ax4.set_ylabel('Y4')
ax5 = fig.add_subplot(gs[1,1])
ax5.set_xlabel('X5')
ax5.set_ylabel('Y5')
fig.tight_layout()
plt.show()
我为题名道歉,但我想不出如何用不同的方式来表达它。下图最能说明问题。如您所见,我使用 matplotlibs gridspec 制作了由 5 个子图组成的图形,它们适合 4 个方形面板。三个空面板有自己的 x 坐标集,需要自己的标签。然而,来自前两个面板的数据共享 X 轴,并且(假设实际标签会很长)我宁愿只有一个标签和一组刻度,如此处所示。
但是正如您所见,这会在两个面板之间留下相当大的白色间隙space,标签本来应该消失的。这就是我想解决的问题;我想等量拉伸两个面板以填满这个白色 space。同时,顶部面板的顶部和底部面板的底部仍应与右侧的子图对齐,并且两个面板的底部不应干扰下方行的位置。我查看了 documentation 中有关调整面板的文档,但我无法弄明白。
顺便说一句,我还想为两个面板设置一个 y 轴标签,但我想我可以用 fig.text()
来捏造它。
生成上述图的代码:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import gridspec
xs = np.linspace(0,8*np.pi,101)
ys = np.cos(xs)
fig = plt.figure(figsize=(7.2,4.45*1.5))
gs1 = gridspec.GridSpec(4, 2, figure=fig)
#gs1.update(hspace=0.1)
ax1 = plt.subplot(gs1[0, 0])
ax1.plot(xs, ys)
#ax1.set_xlabel('X')
ax1.set_ylabel('Y1')
ax1.set_xticks([])
ax2 = plt.subplot(gs1[1, 0])
ax2.plot(xs, 0.5*ys)
ax2.set_xlabel('X')
ax2.set_ylabel('Y2')
ax2.set_ylim(-1,1)
gs2 = gridspec.GridSpec(4, 2)
ax3 = plt.subplot(gs2[0:2, 1])
ax3.set_xlabel('X3')
ax3.set_ylabel('Y3')
ax4 = plt.subplot(gs2[2:, 0])
ax4.set_xlabel('X4')
ax4.set_ylabel('Y4')
ax5 = plt.subplot(gs2[2:, 1])
ax5.set_xlabel('X5')
ax5.set_ylabel('Y5')
plt.tight_layout()
您可以在 2x2 gridspec 的一个象限中使用 SubplotSpec
。
找到一个例子 int gridspec-using-subplotspec.
这里看起来像
import numpy as np
from matplotlib import pyplot as plt
xs = np.linspace(0,8*np.pi,101)
ys = np.cos(xs)
fig = plt.figure(figsize=(7.2,4.45*1.5))
# 2x2 "outer" GridSpec
gs = fig.add_gridspec(2, 2)
# 2x1 "inner" GridSpec to be used
# in one cell of the outer grid
gs00 = gs[0,0].subgridspec(2, 1)
ax1 = fig.add_subplot(gs00[0])
ax1.plot(xs, ys)
ax1.set_ylabel('Y1')
ax1.set_xticks([])
ax2 = fig.add_subplot(gs00[1])
ax2.plot(xs, 0.5*ys)
ax2.set_xlabel('X')
ax2.set_ylabel('Y2')
ax2.set_ylim(-1,1)
ax3 = fig.add_subplot(gs[0,1])
ax3.set_xlabel('X3')
ax3.set_ylabel('Y3')
ax4 = fig.add_subplot(gs[1,0])
ax4.set_xlabel('X4')
ax4.set_ylabel('Y4')
ax5 = fig.add_subplot(gs[1,1])
ax5.set_xlabel('X5')
ax5.set_ylabel('Y5')
fig.tight_layout()
plt.show()