在Matplotlib中缩小PDF图形文件的大小

15

我在 matplotlib 中使用 LineCollection 来绘制和着色国家,其中给出了各个国家的边界。当我将图保存为pdf文件时:

fig.savefig('filename.pdf',dpi=300)

这些图形大小相当大。然而,将它们保存为 PNG 文件时:

fig.savefig('filename.png',dpi=300)

我试图使用Linux的convert命令将它们转换为PDF文件,但文件很小。我尝试减少dpi,但并没有改变PDF文件大小。有没有一种方法可以直接将Matplotlib中的图形保存为较小的PDF文件?


2
我发现这篇博客文章很有帮助:http://www.astrobetter.com/blog/2014/01/17/slim-down-your-bloated-graphics/ - Yibo Yang
2个回答

35

PDF文件更大,因为它包含了所有的矢量信息。通过保存为PNG图像,你会产生一个栅格化的图片。在你的情况下,直接将绘图栅格化可以生成一个较小的PDF文件:

plt.plot(x, y, 'r-', rasterized=True)

这里,x, y 是一些绘图坐标。你基本上需要使用附加的关键字参数 rasterized 来实现这个效果。


1
谢谢。我尝试使用 lines = LineCollection(...),lines.set_rasterized(True)。虽然这将图片大小显著降低(从3mb减少到800kb),但仍比转换为png文件后的大小(400kb)要大。 - imsc
你尝试过在创建图形时将dpi设置为较低的值吗?例如:fig = plt.figure(dpi=100) - David Zwicker
是的。两个PDF文件(直接保存和从PNG转换而来)都以dpi=300保存。如果我使用dpi=100,则图形大小会减小,但质量低于PNG文件。 - imsc
1
你能否提供一个可工作的示例,以便我们可以尝试不同的设置?还有其他艺术家可能从栅格化中受益吗? - David Zwicker
数据文件很大,所以有些困难。如果曲线足够平滑,那么在光栅化后,PNG和PDF文件的大小是相同的。然而,我猜测,由于我的情况中曲线是海岸线(锯齿形数据),所以PDF和PNG的大小是不同的。你的答案非常接近我想要的。再次感谢。 - imsc
您还可以设置栅格化顺序,如 https://dev59.com/spbfa4cB1Zd3GeqPxrjK 所示。 - Løiten

3

我认为使用“rasterized = True”可以有效地保存图像,类似于png格式。当您放大时,您将看到模糊的像素。

如果您想要高质量的图形,我的建议是从数据中进行采样并制作绘图。PDF文件大小大约取决于需要记住的数据点数量。


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