matplotlib 重叠约束三维子图

uz75evzq  于 2023-05-18  发布在  其他
关注(0)|答案(3)|浏览(120)

我必须调整哪些旋钮来防止这些问题:

  • 重叠轴标签
  • 带有裁剪轴标签的重叠地块

我使用matplotlib 3.5.1和PGF后端。一些旧版本的解决方案不再工作。

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)
zbsbpyhn

zbsbpyhn1#

摆脱约束布局并使用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()

8ulbf1ek

8ulbf1ek2#

虽然紧凑布局和约束布局都可以用于3d投影(mplot3d),但约束布局似乎不理解如何填充3d标记标签,导致标签重叠或修剪。两个布局管理器都调整子图填充和轴大小,给定一个固定的图形大小。两者都不能使图形大小适合内容。要使用紧凑布局来完成此操作,请通过多次迭代从当前图形紧凑bbox中推断所需的图形大小。使用受约束布局管理器时,请将轴紧bbox和填充相加以确定任何多余的空间。紧凑布局可调整子绘图部分(轴尺寸和图形填充),并支持“h_pad”和“w_pad”参数。约束布局可调整轴大小,并支持“wspace”、“hspace”、“w_pad”和“h_pad”参数。紧凑布局将子地块压缩成紧凑组,然后将其集中在可用空间中。受约束的布局将子地块均匀分布在所有可用空间中。不管布局管理器是什么,如果刻度重叠或聚集得太紧,请将刻度定位器切换为“MaxNLocator”,以获得较小的“n”。
根本问题是3d投影刻度标签在绘制完整画布之前是空的。受约束布局管理器执行的“_draw_disabled”绘制不足以触发刻度标签。如果你跟踪axis tight bbox,你会注意到它们直到调用“fig.canvas.draw”之后才包含标签,在此之前,标记标签只是“Text(0,0,'')"。请确保在调整图形大小后包含此调用,然后布局将按预期受到约束。给定一个固定的图形宽度,根据美观性设置高度,或者对带有填充的轴进行求和,以确定可能的最小高度。

vdzxcuhz

vdzxcuhz3#

万一你要将它嵌入到PyQt Gui中,使用mpl工具栏,这个顺序可能会有帮助:

fig.canvas.draw()
fig.set_constrained_layout(True)
# update your ax as needed here
ax.set_anchor('C') # or whichever position desired
plt.draw()
toolbar.update()

相关问题