以高质量在python中保存图像

dus*_*tin 95 python graphics matplotlib save

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

也就是说,当我继续放大保存在pdf文件中的对象时,没有模糊?

另外,保存它的最佳模式是什么?

png,eps?还是其他一些?我不能这样做,pdf因为有一个隐藏的数字发生混乱Latexmk编译.

spe*_*on2 139

如果您正在使用matplotlib并尝试在乳胶文档中获得好的数字,请另存为eps.具体来说,在运行绘制图像的命令后尝试这样的事情:

plt.savefig('destination_path.eps', format='eps')
Run Code Online (Sandbox Code Playgroud)

我发现eps文件效果最好,dpi参数是真正让它们在文档中看起来很好的东西.

更新:

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

ax.view_init(elev=elevation_angle, azim=azimuthal_angle)
Run Code Online (Sandbox Code Playgroud)

其中elevation_angle是指定极角(从垂直z轴向下)的数字(以度为单位),并azimuthal_angle指定方位角(围绕z轴).

我发现通过首先绘制图像然后旋转它并观察角度的当前值出现在窗口底部正好低于实际绘图的位置来确定这些值是最容易的.请记住,默认情况下会显示x,y,z位置,但在您开始单击+拖动+旋转图像时会替换为两个角度.

  • 为什么需要DPI参数?eps不是矢量格式吗? (6认同)
  • 好点 - svg、pdf、eps 等矢量格式不需要 DPI (3认同)
  • 如果您愿意,可以省略 `format='eps'`。在这种情况下,格式是从文件名推断出来的。 (3认同)

gro*_*fte 58

只是添加我的结果,也使用matplotlib.

.eps使我的所有文字都变为粗体并删除了透明度..svg给了我高分辨率的图片,实际上看起来像我的图表.

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

我使用1200 dpi,因为许多科学期刊需要1200/600/300 dpi的图像,具体取决于图像的含义.在GiMP或Inkscape中转换为所需的dpi和格式.

编辑:显然dpi并不重要,因为.svg是矢量图形并具有"无限分辨率".

  • 当我们在图中某处使用“ imshow(..)”时,DPI至关重要。这些位图在嵌入到SVG中时会栅格化。使用默认的DPI,结果甚至比我们在屏幕上看到的还要差,绝对不适合出版物。 (2认同)
  • 我还强烈推荐 Scour (https://github.com/scour-project/scour) 来减小 svg 文件的大小。在最激进的设置下,我可以将文件大小减少到原始大小的 50% - 如果我使用 .svgz 压缩格式,则为 5%。 (2认同)

Lee*_*evo 8

如果您使用的是seaborn图,而不是 Matplotlib,您可以像这样保存 .png 图像:

假设您有一个matrix对象(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
Run Code Online (Sandbox Code Playgroud)

此代码与最新版本的 Seaborn 兼容。Stack Overflow 周围的其他代码仅适用于以前的版本。

我喜欢的另一种方式是这样。我设置下一个图像的大小如下:

plt.subplots(figsize=(15,15))
Run Code Online (Sandbox Code Playgroud)

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


Eam*_*nny 7

您可以使用以下方法将图形保存为 1920x1080(或 1080p):

fig = plt.figure(figsize=(19.20,10.80))
Run Code Online (Sandbox Code Playgroud)

你也可以走得更高或更低。上述解决方案适用于打印,但现在您希望创建的图像进入 PNG/JPG 或以宽屏幕格式显示。

  • 您可能应该补充一点,这是因为(通常)dpi 的默认值为 100,而 Figsize 的单位为英寸。所以 19.2 英寸每英寸有 100 个点,在该尺寸上有 1920 个点 =D (3认同)

小智 5

好的,我发现spencerlyon2的答案有效,但是万一有人发现自己不知道该怎么做,我就必须这样做:

beingsaved = plt.figure()

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