matplotlib的savefig()与show()绘图不同

103 投票
4 回答
365643 浏览
提问于 2025-04-17 05:03

当我使用 show() 来绘制 X 中的图表时,图表看起来非常好。但是,当我开始使用 savefig() 来生成大量图表时,savefig() 生成的图表的字体、线条和多边形都看起来比 show() 生成的图表小。我使用的环境是 Ubuntu,show() 的后端是 Qt4Agg。我该如何让 show() 绘制的图和 savefig() 绘制的图看起来一致呢?

4 个回答

33

你可以用不同的方式来显示你的 matplotlib 图,比如在屏幕上通过 Quartz 显示,或者通过 pdf 文件保存。这两种方式使用的函数是 plotsavefig,它们的参数几乎是一样的,但默认值却不相同。

换句话说,savefig 的默认参数和 display 的默认参数是 不同的

如果你想让它们一致,其实很简单,只需要在 matplotlib 配置文件 中进行设置。这个模板文件在源代码包里,名字叫 matplotlibrc.template。如果你在安装 matplotlib 时没有创建这个文件,可以从 matplotlib 的源代码或者从 matplotlib 网站上获取这个模板。

一旦你按照自己的需求修改了这个文件,就把它重命名为 matplotlibrc(不要加扩展名),然后保存到 .matplotlib 这个目录下(注意前面有个 '.'),这个目录应该在你的主目录里。

关于 保存图形 的配置参数大约在提供的 matplotlibrc.template 文件的 314 行 开始(这一部分的前一行是:### SAVING FIGURES)。

特别是,你需要关注这些参数:

savefig.dpi       : 100         # figure dots per inch
savefig.facecolor : white       # figure facecolor when saving
savefig.edgecolor : white       # figure edgecolor when saving
savefig.extension : auto        # what extension to use for savefig('foo'), or 'auto'

在这些行下面是字体类型和各种图像格式特定参数的设置。

显示 的参数,也就是 PLT.show(),大约在 matplotlibrc.template277 行 开始(这一部分的前一行是:### FIGURE):

figure.figsize   : 8, 6          
figure.dpi       : 80            
figure.facecolor : 0.75       
figure.edgecolor : white     

通过比较这两个参数块的值,你可以看到,savefigdisplay(显示)对于同一个图形属性的默认设置是 不同的

45

这个问题虽然老旧,但显然谷歌很喜欢,所以我在这里分享一下我的研究结果。

如果你从头开始创建一个图形,可以在创建时设置它的大小:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(3, 6))

plt.plot(range(10)) #plot example
plt.show() #for control

fig.savefig('temp.png', dpi=fig.dpi)

figsize(width,height) 这个选项可以调整你图形的实际尺寸,确保两个图看起来一样大。

正如其他回答中提到的,dpi 选项会影响文本的相对大小和线条的宽度等。使用 dpi=fig.dpi 这个选项可以确保在 show()savefig() 中这些元素的相对大小是一致的。

另外,图形的大小也可以在创建后进行调整:

fig.set_size_inches(3, 6, forward=True)

forward 这个选项可以让你动态地改变图形的大小。

如果你发现生成的图像边框太大,可以通过以下方式进行调整:

plt.tight_layout()
#or:
plt.tight_layout(pad=2)

或者:

fig.savefig('temp.png', dpi=fig.dpi, bbox_inches='tight')
#or:
fig.savefig('temp.png', dpi=fig.dpi, bbox_inches='tight', pad_inches=0.5)

第一个选项只是最小化布局和边框,而第二个选项则允许你手动调整边框。这些小技巧至少帮助我解决了 savefig()show() 生成的图像不一样的问题。

110

savefig 是用来设置保存图像时的 DPI(每英寸点数)。如果你没有在 .matplotlibrc 文件中指定,默认的 DPI 是 100。你可以查看 savefigdpi 参数 来了解更多信息。需要注意的是,保存的图像不会继承原始图像的 DPI。

DPI 会影响文本的相对大小和线条的宽度等。如果你希望保存的图像看起来和原始图像一模一样,那么可以把 fig.dpi 传递给 fig.savefig

例如:

import matplotlib.pyplot as plt

fig = plt.figure()
plt.plot(range(10))
fig.savefig('temp.png', dpi=fig.dpi)

撰写回答