有没有一种简单的方法可以确保 matplotlib 子图保持正方形并且不与第二个子图重叠?

Is there an easy way to ensure matplotlib subplot remains square and doesn't overlap with second subplot?

我试图在同一个 Figure 对象中显示两个子图,一个饼图和一个 table:

足够接近纵横比,通过 figsize 和 wspace trial/error:

所需的 pie:table 宽度比为 1:2。问题是,我似乎无法确保饼图子图保持正方形(因此饼图保持圆形),我也不能让第二个 table 子图不与第一个子图重叠,而不仅仅是尝试 figsize 和 wspace组合直到它起作用。

为了确保第一个子图是正方形的,我建立了一个方程,1x + 2x +(3x/2)wspace = 12。1x 是第一个子图的宽度, 2x 是第二个子图的宽度,3x/2wspace 应该是它们之间的 wspace(3x/2 是两个子图的平均宽度)。如果我指定 figsize 宽度为 12,这应该总和为 12。从这里我可以计算出 x,它应该等于第一个子图的宽度,然后将它设置为我的 figsize 高度。当使用 0.3 的 wspace 时,这给了我大约 3.478 的高度。

这是我目前的代码:

rows = ['Category 1', 'Category 2', 'Category 3', 'Category 4', 'Category 5','Category 6', 'Category 7']
cols = ['+100', '+200', '+300', '+400', '+500'] 
vals = [[',990', ',990', ',990', ',990', ',990'],
       [',211', ',211', ',211', ',211', ',211'],
       [',999', ',996', ',989', ',979', ',966'],
       [',214', ',214', ',214', ',214', ',214'],
       [',674', ',674', ',674', ',674', ',674'],
       [',440', ',440', ',440', ',440', ',440'],
       [',342', ',341', ',340', ',338', ',336']]
bbox = [0, 0, 1, 1]
fig, (ax1, ax2) = plt.subplots(1,2, figsize=(12,3.478), gridspec_kw={'width_ratios':[1,2]})
fig.tight_layout()
ax1.pie([1,0])
ax2.axis('off')
table = ax2.table(cellText=vals, rowLabels=rows, colLabels=cols,bbox=bbox)
table.auto_set_font_size(False)
table.set_fontsize(12)
plt.subplots_adjust(wspace=.3)

这会产生以下结果:

压扁:

我猜测边距数字是无花果大小的,所以我上面的等式实际上不起作用。我也试过不指定 wspace,但这会产生以下重叠和压缩的图像:

未指定 wspace,重叠并被压扁:

我也试过 ax2.set_outscale_on(False),但这似乎没有任何改变。

我的 post 顶部的第一张图片经过多次试验和错误,落在 3.478 的无花果高度和 .5 的宽度空间上。我敢肯定它不是完全正方形,但对我来说已经足够好了。有没有更简单的方法可以将子图强制为方形纵横比?第二个问题是确保默认情况下不会重叠,而不必弄乱 wspace,但如果需要,我可以手动调整 wspace。感谢您的任何建议!

要让两个子图都保持正方形,你可以这样做

fig, (ax1, ax2) = plt.subplots(ncols=2)
ax1.set_aspect('equal', adjustable='box')
ax2.set_aspect('equal', adjustable='box')

如果您只想要正方形,那么您可以将 ax1 的纵横比设置为 'equal',将 ax2 的纵横比设置为 'auto'。您还可以将 wspace 增加一点,以确保它们不会重叠。