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

标签 matplotlib svg scatter-plot subplot inkscape

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

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

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

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

最佳答案

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

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

您可以通过在调用 rasterized=True 时设置 ax.scatter 来做到这一点。

然后,您可以在 dpi=300 时使用 fig.savefig (或您想要的任何 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。

关于Matplotlib 多个散点图 - 减小 svg 文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51418310/

相关文章:

python - 在 python 中绘制 3D 矩阵的最佳方法

python-2.7 - 使用散点图在颜色条上显示所有颜色

具有 Lowess 曲线的 Matlab 散点图

r - 在 R 中对散点图进行聚类

python - 动画 2D 绘图(2D 布朗运动)在 Python 中不起作用

python - 你如何限制matplotlib中的y轴高度?

python - plt.plot()、object.plot() 之间有什么区别

javascript - 悬停样式和过渡不适用于 Firefox 中的附加元素

javascript - 如何使用变换属性更改圆形 svg 元素的位置?

html - 将 SVG 放在 html 元素上