Matplotlib的contourf图像文件大小

3

我在 matplotlib 中绘制了一个 contourf 图形,其大小约为 5 兆字节。有什么建议可以缩小它的大小吗?


这个数字占用了5兆字节的常驻内存?还是在栅格化并写入文件时才占用5兆字节? - Brian Cain
以 PDF 格式写入磁盘时的大小为 5 兆字节。 - user2379888
对于一些数据集,PDF 可能是最坏的情况,因为它通常会保留向量。虽然我的经验通常都是用散点图。试试将其转换为 PNG 格式。如果有效的话,您可以在单独的步骤中将 PNG 嵌入 PDF。 - Brian Cain
有没有一种方法可以将绘图光栅化,但保留轴标签和标题作为矢量数据? - user2379888
是的,显然可以:https://dev59.com/6G035IYBdhLWcg3wH8Ql#5638626 - Brian Cain
1
@BrianCain 这对于某些类型的Axes对象有效,但不适用于contourf。请参阅我的答案以了解解决方法。 - tmdavison
1个回答

2
问题在于您的contourf元素过多。
对于某些类型的Axes对象,您可以在调用绘图函数时将rasterized选项设置为True。例如,使用pcolormesh,您可以使用。
plt.pcolormesh(some_array,rasterized=True)

然而,对于`contourf`而言,这种方法似乎不起作用。但是,有一种解决方法。您可以将`zorder`设置为较低的数字,然后将`Axes`的`rasterization_zorder`设置为高于该数字的某个数字,当您保存图像时,`contourf`返回的`QuadContourSet`将被栅格化。
例如:
plt.contourf(some_array,zorder=-9)
plt.gca().set_rasterization_zorder(-1)

以下是绘制形状为(500,500)np.random.rand数组后的一些示例文件大小。

import matplotlib.pyplot as plt
import numpy as np

my_array = np.random.rand(500,500)

plt.contourf(my_array)
plt.savefig('contourf1.pdf')
plt.close()

plt.contourf(my_array,rasterized=True) # this won't work
plt.savefig('contourf2.pdf')
plt.close()

plt.contourf(my_array,zorder=-9)
plt.gca().set_rasterization_zorder(-1)
plt.savefig('contourf3.pdf')
plt.close()

这将生成以下三个文件:

$ ls -l contour?.pdf
-rw-r--r-- 1 tom 22804867 Oct 21 10:59 contourf1.pdf
-rw-r--r-- 1 tom 22808387 Oct 21 11:01 contourf2.pdf
-rw-r--r-- 1 tom   851117 Oct 21 11:03 contourf3.pdf

请注意第三个文件的文件大小要小得多。

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