【问题标题】:matplotlib // space between subplotsmatplotlib // 子图之间的空间
【发布时间】:2020-09-28 07:26:49
【问题描述】:

我想使用来自matplotlib.pyplotsubplots 绘制图像(第一行)和一些图表(第二行和第三行)。但是,imshow 函数在我无法摆脱的图像周围添加了一些额外的空白。这是我的代码和我得到的情节:

rcParams['figure.figsize'] = (16, 14)
_, axes = plt.subplots(3, 3)

axes[0][0].imshow(image)
axes[0][0].set_title('title')
axes[0][0].set_xticklabels(list())
axes[0][0].set_yticklabels(list())
axes[0][0].grid(False)

axes[0][1].imshow(image)
axes[0][1].set_title('title')
axes[0][1].set_xticklabels(list())
axes[0][1].set_yticklabels(list())
axes[0][1].grid(False)

axes[0][2].imshow(image)
axes[0][2].set_title('title')
axes[0][2].set_xticklabels(list())
axes[0][2].set_yticklabels(list())
axes[0][2].grid(False)

plt.savefig(file_name, bbox_inches='tight')

在下图中,您可以清楚地看到第一行和第二行之间的空间明显更大:

我希望所有子图之间的空间相等。最简单的方法是什么?

提前感谢您的任何建议!

最好, 阿列克谢

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    这是因为imshow 显示的是方形像素的图像。如果图像作为一个比例,例如16:9,子图将被重新塑造以适应图像大小。因此,它们将具有与其他子图不同的形状(请参阅imshow documentation 了解更多信息)。

    从这里,您有两个解决方案:

    • 降低图形高度以手动减少子图之间的垂直空间
    • 防止imshow根据图像调整轴的大小。为此,您可以将纵横比设置为自动aspect="auto",并且图像将适合现有轴

    【讨论】:

    • aspect="auto" 导致空间相等,但以图像失真为代价
    • 在这种情况下,只有第一个解决方案适合您:例如,如果您尝试使用rcParams['figure.figsize'] = (16, 11),它会更好吗? (你需要玩弄图形高度)。
    • 是的,越来越好,但我对结果并不完全满意......这很奇怪,似乎是一个非常基本的事情