matplotlib的savefig()与show()绘图不同
当我使用 show()
来绘制 X
中的图表时,图表看起来非常好。但是,当我开始使用 savefig()
来生成大量图表时,savefig()
生成的图表的字体、线条和多边形都看起来比 show()
生成的图表小。我使用的环境是 Ubuntu,show()
的后端是 Qt4Agg
。我该如何让 show()
绘制的图和 savefig()
绘制的图看起来一致呢?
4 个回答
你可以用不同的方式来显示你的 matplotlib 图,比如在屏幕上通过 Quartz 显示,或者通过 pdf 文件保存。这两种方式使用的函数是 plot 和 savefig,它们的参数几乎是一样的,但默认值却不相同。
换句话说,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.template 的 277 行 开始(这一部分的前一行是:### FIGURE):
figure.figsize : 8, 6
figure.dpi : 80
figure.facecolor : 0.75
figure.edgecolor : white
通过比较这两个参数块的值,你可以看到,savefig 和 display(显示)对于同一个图形属性的默认设置是 不同的。
这个问题虽然老旧,但显然谷歌很喜欢,所以我在这里分享一下我的研究结果。
如果你从头开始创建一个图形,可以在创建时设置它的大小:
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() 生成的图像不一样的问题。
savefig
是用来设置保存图像时的 DPI(每英寸点数)。如果你没有在 .matplotlibrc 文件中指定,默认的 DPI 是 100。你可以查看 savefig
的 dpi
参数 来了解更多信息。需要注意的是,保存的图像不会继承原始图像的 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)