减少散点图的文件大小

时间:2016-10-11 09:47:04

标签: python matplotlib

我目前正在尝试减少散点图的文件大小。我的代码如下:

plt.scatter(a1,b1)
plt.savefig('test.ps')

其中a1,b1是大小为400,000左右的数组,它的文件大小为7.8MB。

我尝试过添加

plt.rcParams['path.simplify'] = True

在这段代码之前,但文件仍为7.8MB。这是一个问题,它如何保存为“.ps”文件或其他问题?

3 个答案:

答案 0 :(得分:2)

你可以考虑使用例如browserify ./app.js -o bundle.js -t [ babelify --presets react ] - 当你有一个密集的点集时,我特别喜欢这个,因为它更好地指出你的数据集中在哪里。例如:

hexbin

enter image description here

从左图中,我可以得出结论,import numpy as np import matplotlib.pylab as pl x = np.random.normal(size=40000) y = np.random.normal(size=40000) pl.figure() pl.subplot(121) pl.scatter(x, y) pl.xlim(-4,4) pl.ylim(-4,4) pl.subplot(122) pl.hexbin(x, y, gridsize=40) pl.xlim(-4,4) pl.ylim(-4,4) 之间的点数分布大致相等,但事实并非如此。

http://matplotlib.org/examples/pylab_examples/hexbin_demo.html

答案 1 :(得分:1)

一种方法是使用plot而不是scatter(您仍然可以使用plot参数使用'o'生成散点图,并使用{{1关键字参数,如下所示:

rasterized

这应该会显着减小输出文件的大小。文本和艺术线条将保持向量,只有点被光栅化,所以这是一个很好的妥协。

根据您希望实现的目标,最好对数据进行直方图编制并对其进行绘图(例如import numpy as np import matplotlib.pyplot as plt a1,b1 = np.random.randn(400000,2).T #mock data of similar size to yours plt.plot(a1,b1,'o',rasterized=True) plt.savefig("test.ps") pyplot.hist2d)。

答案 2 :(得分:1)

我认为这是由PostScript格式引起的,没有什么可以改变的。我们来算一算:

7.8MB类似于7.8 * 1024 * 1024 = 8,178,892.8。假设散点图中有400,000个点,这意味着如果文件中没有其他内容(即没有图例,没有注释等),您的文件会为散点图中的每个点分配20个字节。

现在,我不是PostScript专家,但是查看输出test.ps,用于在PostScript中绘制圆圈的命令如下所示:

[x] [y] o

其中x和y是每个点的坐标。由于这些是浮点值,因此信息确实总共增加了15个字节,这与我上面的猜测相差不远。

所以是的,文件大小是由PostScript文件的性质引起的,PostScript文件为散点图中的400,000个点中的每个点存储了相当多的信息。

您可以将散点图存储为@AngusWilliams'答案中建议的栅格化图像,这将导致较小的文件大小。但是,您将失去基于矢量的文件格式的优势:在任何分辨率下无损缩放。

如果您不需要基于矢量的文件格式的这种优势,那么使用像.png这样的其他文件格式可能会更好,在压缩图像方面通常比包含光栅化信息的PostScript更好