重叠约束 3d 子图

overlapping constrained 3d subplots

我必须调整哪些旋钮才能防止出现这些问题:

我在 PGF 后端使用 matplotlib 3.5.1。旧版本的一些解决方案不再有效。

fig, axes = plt.subplots\
    (2, 3, constrained_layout=True, subplot_kw=dict(projection="3d"))

#it = np.nditer(axes, flags=["refs_ok","multi_index"])
#for ax in it:
#    # Plot the surfaces, add row and column title annotations.
#    pass

width = 150 * 0.8 * mm
height = width * 0.65
fig.set_size_inches(width, height)
fig.savefig("something.pgf", dpi=300)
plt.close(fig)

摆脱受限布局并使用 plt.subplots_adjust(wspace=<value>, hspace=<value>) 对我有用

from matplotlib import pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=3, subplot_kw=dict(projection="3d"))

plt.subplots_adjust(wspace=0.5,hspace=0.5)

labels_x, labels_y, labels_z = [['x-axis']*3]*2, [['y-axis']*3]*2, [['z-axis']*3]*2

for i in range(len(axes)):
    for j in range(len(axes[i])):
        axes[i,j].set_xlabel(labels_x[i][j])
        axes[i,j].set_ylabel(labels_y[i][j])
        axes[i,j].set_zlabel(labels_z[i][j])
    
plt.show()

虽然紧凑布局和受限布局都可以与 3d 投影 (mplot3d) 一起使用,但似乎受限布局不了解如何填充 3d 刻度标签,从而导致重叠或修剪标签。给定固定图形大小,两个布局管理器都会调整子图填充和轴大小。两者都不能使图形大小适合内容。要使用紧凑的布局来做到这一点,通过多次迭代从当前图形紧凑的 bbox 中推断出所需的图形大小。使用受约束的布局管理器时,将轴紧密 bbox 和填充求和以确定任何无关的 space。紧密布局调整子图参数(轴大小和图形填充)并支持“h_pad”和“w_pad”参数。约束布局调整轴大小并支持“wspace”、“hspace”、“w_pad”和“h_pad”参数。紧凑的布局将子图挤压成一个紧密的组,然后以可用 space 为中心。受限布局将子图均匀分布在所有可用 space 中。无论布局管理器如何,如果刻度重叠或聚集得太紧,请将刻度定位器切换为“MaxNLocator”以获得更小的“n”。

根本问题是 3d 投影刻度标签在完整 canvas 绘制之前是空的。受约束布局管理器执行的“_draw_disabled”绘制不足以触发刻度标签。如果您跟踪轴紧 bbox,您会注意到它们在调用“fig.canvas.draw”之前不包含标签,在此之前刻度标签只是“Text(0, 0, '')”。请务必在调整图形大小后包含此调用,然后布局将按预期进行约束。给定一个固定的图形宽度,根据美学设置高度或将轴紧密 bbox 与填充求和以确定可能的最小高度。