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

2024-10-03 21:29:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

通过figsize和wspace试错实现足够接近的纵横比:

enter image description here

所需的饼图:表格宽度比为1:2。问题是,我似乎无法确保饼图子图保持方形(因此饼图保持圆形),也无法防止第二个表子图与第一个表子图重叠,而不只是尝试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 = [['$18,990', '$18,990', '$18,990', '$18,990', '$18,990'],
       ['$24,211', '$24,211', '$24,211', '$24,211', '$24,211'],
       ['$19,999', '$19,996', '$19,989', '$19,979', '$19,966'],
       ['$26,214', '$26,214', '$26,214', '$26,214', '$26,214'],
       ['$16,674', '$16,674', '$16,674', '$16,674', '$16,674'],
       ['$21,440', '$21,440', '$21,440', '$21,440', '$21,440'],
       ['$19,342', '$19,341', '$19,340', '$19,338', '$19,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)

这将产生以下结果:

压扁:

enter image description here

我在猜测figsize中的利润数字,所以我上面的等式实际上不起作用。我也尝试过不指定wspace,但这会产生以下重叠和挤压图像:

未指定wspace、重叠和挤压:

enter image description here

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

我帖子顶部的第一张图片经过了多次尝试和错误,它的无花果高度为3.478,wspace为0.5。我肯定它不是完全方形的,但我觉得它足够好看了。有没有一种更简单的方法来强制子地块具有方形纵横比?第二个关注点是确保默认情况下不会重叠,而不必干扰wspace,但如果需要,我可以手动调整wspace。谢谢你的建议


Tags: 宽度高度tablerowscols方形setcategory
1条回答
网友
1楼 · 发布于 2024-10-03 21:29:24

要使两个子地块都保持方形,您可以这样做

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

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

相关问题 更多 >