Matplotlib 多个散点子图 - 减少 svg 文件大小

Matplotlib multiple scatter subplots - reduce svg file size

我在 Matplotlib 中生成了一个由 50 个子图组成的图。在这些子图中的每一个中,我都有一个包含大约 3000 个数据点的散点图。我这样做是因为我只想对我正在处理的文档中的不同散点图有一个概览。

到目前为止这也有效并且看起来不错,但问题显然是我得到的 SVG 文件非常大(大约 15 MB)。而 Word 无法处理这么大的 SVG 文件。

所以我的问题是:有没有办法优化这个 SVG 文件?我在散点图中的很多数据点相互重叠,所以我想应该可以在不改变可见输出的情况下删除其中的许多 "invisible" 个数据点。 (所以在 illustrator 中做这样的事情似乎是我想做的:Link)是否也可以在 Inkscape 中做这样的事情?或者甚至直接在 Matplotlib 中?

我知道我只能生成一个 PNG 文件,但我更希望在我的文档中将绘图作为矢量图形。

如果您想将所有数据点保留为矢量图形,则不太可能减小文件大小。

虽然不理想,但一种可能的选择是仅对 ax.scatter 创建的数据点进行栅格化,并将坐标轴、标签、标题等全部保留为图形上的矢量元素。这可以显着减小文件大小,如果您将 dpi 设置得足够高,您可能不会丢失绘图中的任何有用信息。

调用ax.scatter时设置rasterized=True即可。

然后,当您 fig.savefig.

时,您可以使用 dpi=300(或您想要的任何 dpi)控制光栅化元素的 dpi

考虑以下因素:

import matplotlib.pyplot as plt

figV, axesV = plt.subplots(nrows=10, ncols=5)
figR, axesR = plt.subplots(nrows=10, ncols=5)

for ax in figV.axes:
    ax.scatter(range(3000), range(3000))
for ax in figR.axes:
    ax.scatter(range(3000), range(3000), rasterized=True)

figV.savefig('bigscatterV.svg')
figR.savefig('bigscatterR.svg', dpi=300)

bigscatterV.svg 的文件大小为 16MB,而 bigscatterR.svg 的文件大小仅为 250KB。