在Python中以非常高的质量保存图像

184

如何以非常高的质量保存Python绘图?

也就是说,当我在PDF文件中保存的对象上不断缩放时,为什么没有模糊?

此外,最佳模式是什么?

pngeps?还是其他的?我不能使用pdf,因为会有一个隐藏的数字影响Latexmk编译。

5个回答

225

如果您正在使用Matplotlib并尝试在LaTeX文档中获得良好的图像,请将其保存为EPS格式。具体来说,在运行绘制图像的命令后,可以尝试执行以下操作:

plt.savefig('destination_path.eps', format='eps')

我发现EPS文件效果最好,而 dpi 参数是让它们在文档中看起来更好的关键。

要在保存之前指定图形的方向,只需在调用 plt.savefig 之前但在创建绘图后调用以下内容(假设您使用名称为 ax 的轴进行了绘制):

ax.view_init(elev=elevation_angle, azim=azimuthal_angle)

其中elevation_angle是一个数字(以度为单位),表示极角(从竖直z轴向下)和azimuthal_angle表示方位角(围绕z轴旋转)。

我发现最容易确定这些值的方法是先绘制图像,然后旋转它并观察角度的当前值,它们会出现在窗口底部实际绘图区域的正下方。请注意,默认情况下会显示x、y、z位置,但是当您开始点击+拖动+旋转图像时,它们会被两个角度替换。


1
@spencerlon2 如果我想在保存之前更改图形的方向怎么办? - dustin
25
为什么我们需要DPI参数?难道EPS不是矢量格式吗? - mkvoya
3
好的观点 - 对于矢量格式如svg、pdf、eps,不需要DPI。 - spencerlyon2
3
如果你想的话,可以省略 format='eps'。这种情况下,文件格式将从文件名中推断出来。 - timgeb
@mkvoya 我认为使用更高的“dpi”,图像可以放大得更多。 - zyy
如果导出的图形除了矢量图之外还包含光栅元素(图像),则dpi非常重要。简而言之,较低的dpi导出将包含像素化的嵌入式图像等光栅元素。 - PPR

119

补充我的结果,我也使用了Matplotlib。

.eps 使得所有文字加粗,并且去除透明度。.svg 给了我高分辨率的图片,看起来和我的图表一样。

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# Do the plot code
fig.savefig('myimage.svg', format='svg', dpi=1200)

我使用1200 dpi是因为很多科学期刊要求图片的分辨率为 1200/600/300 dpi,具体取决于图片的内容。在 GIMP 或者 Inkscape中转换成所需的dpi和格式。

显然,dpi并不重要,因为 .svg 是矢量图形,具有“无限分辨率”。


4
当我们在图中使用 imshow(..) 时,DPI非常重要。这些位图在嵌入到SVG中时会被光栅化。使用默认DPI的结果甚至比屏幕上看到的更糟糕,绝对不适合出版。 - Evgeni Sergeev
2
我也强烈推荐使用Scour(https://github.com/scour-project/scour)来减小SVG文件的大小。在最激进的设置下,我可以将文件大小减小到原始大小的50%-如果使用.svgz压缩格式,则可以减小到5%。 - grofte
1
实际上,dpi = 1200 也适用于 png!太棒了,非常感谢 :) - Dmitrij Celov

12

好的,我找到了spencerlyon2的答案可用。但是,如果有人不知道该怎么处理那一行代码,我必须这样做:

beingsaved = plt.figure()

# Some scatter plots
plt.scatter(X_1_x, X_1_y)
plt.scatter(X_2_x, X_2_y)

beingsaved.savefig('destination_path.eps', format='eps', dpi=1000)

dpi=1000就是答案。 - ranthero

11

您可以使用以下方法保存分辨率为1920x1080(或1080p)的图像:

fig = plt.figure(figsize=(19.20,10.80))

您还可以选择更高或更低的分辨率。上述解决方案适用于打印,但现在您可能希望创建的图像以PNG / JPG格式存储或以宽屏格式显示。


3
你可能应该补充说明,这是因为(通常情况下)dpi的默认值为100,而figsize以英寸为单位给出。因此,在每英寸100个点的情况下,19.2英寸在该维度上给出了1920个点 =D - grofte
请注意,当您将“figsize”设置为较大的尺寸时,文本不会按比例缩放,这意味着在以小于100%的比例显示图像时,文本可能无法阅读。最好将“figsize”(接近)设置为文档中的实际大小,然后将“dpi”设置得更高,以增加文本和图像的分辨率。 - hugovdberg

9
如果您正在使用Seaborn绘图而不是Matplotlib,则可以像这样保存.png图片:
假设您有一个矩阵对象(PandasNumPy),并且想要制作热力图:
import seaborn as sb

image = sb.heatmap(matrix)   # This gets you the heatmap
image.figure.savefig("C:/Your/Path/ ... /your_image.png")   # This saves it

这段代码与最新版本的Seaborn兼容。Stack Overflow上的其他代码仅适用于旧版本。
我喜欢的另一种方法是这样的。我按如下设置下一个图像的大小:
plt.subplots(figsize=(15,15))

然后我稍后在控制台中绘制输出,从中可以复制粘贴到需要的地方。(由于Seaborn是建立在Matplotlib之上的,因此不会有任何问题。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接