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

leo*_*on 51 python plot graph matplotlib

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

Joe*_*ton 60

savefig指定已保存图形的DPI(如果未在.matplotlibrc中指定,则默认为100,请查看dpikwargsavefig).它并没有从原始数字的DPI中得到它.

DPI会影响文本的相对大小和线条上笔画的宽度等.如果您希望事物看起来相同,则传递fig.dpifig.savefig.

例如

import matplotlib.pyplot as plt

fig = plt.figure()
plt.plot(range(10))
fig.savefig('temp.png', dpi=fig.dpi)
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道,但这并没有解决问题. (15认同)

dou*_*oug 28

您将matplotlib图表渲染到不同的设备(例如,通过石英在屏幕上使用不同的函数(plot vs savefig)通过pdf 渲染到参数几乎相同,但这些参数的默认值不相同两个功能.

换句话说,在savefig默认参数是从不同的默认的显示参数.

如果你在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'
Run Code Online (Sandbox Code Playgroud)

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

这些相同的参数进行显示,即PLT.show() ,开始在约线277一个在matplotlibrc.template(本节前面有线:###图):

figure.figsize   : 8, 6          
figure.dpi       : 80            
figure.facecolor : 0.75       
figure.edgecolor : white     
Run Code Online (Sandbox Code Playgroud)

正如你可以通过比较参数这两个块的值看,对于相同的人物的属性的默认设置是不同的用于savefig显示(显示).


bri*_*ium 9

老问题,但显然谷歌喜欢它,所以我想我在对这个问题进行一些研究之后给出了答案.

如果您从头开始创建一个图形,则可以在创建时为其指定尺寸选项:

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)
Run Code Online (Sandbox Code Playgroud)

figsize(width,height)调整绘图的绝对尺寸,有助于确保两个绘图看起来相同.

如另一个答案中所述,dpi选项会影响文本的相对大小和行上行程的宽度等.使用dpi = fig.dpi选项可确保show()savefig的相对大小相同().

或者,可以在创建后使用以下内容更改图形大小:

fig.set_size_inches(3, 6, forward=True)
Run Code Online (Sandbox Code Playgroud)

forward允许动态改变大小.

如果在创建的图像中有太大的边框时遇到问题,可以使用以下方法调整这些边框:

plt.tight_layout()
#or:
plt.tight_layout(pad=2)
Run Code Online (Sandbox Code Playgroud)

要么:

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)
Run Code Online (Sandbox Code Playgroud)

第一个选项只是最小化布局和边框,第二个选项允许手动调整边框.这些提示至少帮助我解决了我的不同savefig()show()图像的问题.