一尘不染

matplotlib 中带有标题、轴标签的确切图形大小

javascript

以前也有人问过类似的问题,但我所有的搜索结果都没有解决我的问题。采取以下示例代码:

from matplotlib.pyplot import *
fig = figure(1, figsize=(3.25, 3))
plot([0,1,5,2,9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
fig.savefig('test.png',dpi=600)

结果图形为 2040x1890 像素,即 3.4”x3.15”,x-label 被截断。在图像编辑器中查看 PNG 文件,轴和刻度标签似乎符合所需的大小。我尝试从输出大小和请求大小中获取差异并将其反馈回 (3.25 - (3.4-3.25) = 3.10,但 matplotlib 似乎添加了一个任意缓冲区,但它仍然没有达到所需的大小. 一个人如何制作出所需尺寸的整体图?


阅读 110

收藏
2022-06-20

共1个答案

一尘不染

与大卫罗宾逊的评论一致,此处生成的数字是 3.25 x 3 英寸,由 Photoshop 测量,尽管 xlabel 确实显示截止(python 2.6 64 位中的 mpl 1.1.0,win7)

解决该问题的一种方法是手动调整边距subplot_adjust

from matplotlib.pyplot import *
fig = figure(1, figsize=(3.25, 3))
plot([0, 1, 5, 2, 9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
subplots_adjust(bottom=0.14)   # <--
fig.savefig('test.png', dpi=600) 

这些边距的默认值在 matploblibrc 文件中设置,您可以在那里永久修改它。在我的例子中,下边距的默认值为 0.10。

如果您的图形尺寸错误或正确,例如我的情况,您可以使用 subplot_adjust 为标签提供足够的空间。然后,如果需要,您可以计算校正以获得您想要的实际图片或图形大小,就像您已经做的那样。

保存图形的最终视图取决于该图形的大小。如果您show()将您的图形保存在 matplotlib 视图框架中,您将在图像中获得标签截断。但是,如果您手动增加图像的大小,您将看到标签出现,如果您保存它,它也会出现在保存的图像中。可以说这是所见即所得。你的身材很小,这会让你的标签被剪掉。所以另一种方法是制作一个更大的数字,也许用较低的 dpi 来保持整体大小。这也有效:

from matplotlib.pyplot import *
fig = figure(1, figsize=(6.5, 6))   # <---
plot([0, 1, 5, 2, 9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
fig.savefig('test.png', dpi=300)    # <---

在任何情况下,我都会认为这是一个 matplolib 错误,因为您可以期望在绘图和保存后有一个未切割的数字。

2022-06-20