减少具有许多重叠点和 alpha 的矢量化散点图的磁盘大小
Reduce size on disk of vectorized scatter plot with many overlapping points and alpha
在 matplotlib 中绘制散点图并保存为矢量格式(在本例中为 PDF)时,生成的文件大小随点数缩放。
因为我有很多重叠点很多的点,所以我设置了alpha=.2
来查看点的分布有多密集。在中心区域,这导致显示的颜色等于 alpha=1
.
的外观
在将图形保存到矢量化文件时,有什么方法可以"crop"这些区域(f.i。通过组合指定距离内的重叠点),所以保存某种区域保存每个单点?
我忘了说:因为我需要绘制多个变量的相关性,所以我需要一个 (n x n) 散点图矩阵,其中 n
是变量的数量。这阻碍了 hexbin
或其他方法的使用,因为我必须自己创建一个完整的绘图网格。
例如:
fig_sc = plt.figure(figsize=(5, 5))
ax_sc = fig_sc.gca()
ax_sc.scatter(
np.random.normal(size=100000),
np.random.normal(size=100000),
s=10, marker='o', facecolors='none', edgecolors='black', alpha=.3)
fig_sc.savefig('test.pdf', format='pdf')
这导致文件大小约为 1.5MB,因为每个点都被保存了。我可以通过合并重叠点以某种方式 "reduce" 这张图片吗?
我尝试了几个选项,例如设置 dpi=300
和 transparence=False
,但由于 PDF 将图形存储为矢量化图像,这自然不会改变任何东西。
可能有用但有缺点的东西:
- hexbin 图:如果正确调整了分辨率和 cmap,则适用于单个散点图,但我想用 (n x n) 散点图绘制散点矩阵。没有 hexbin 矩阵图。
- 保存为光栅化格式:这些图适用于尽可能要求矢量化图的期刊。因此,我想避免将图像存储为光栅化图像。
- 随机提取部分数据:可能有效,但会改变绘图的外观。
有什么想法吗?
提前致谢!
这可能是作弊,但您可以将其保存为 .png 文件,然后通过 Latex 将其插入 pdf canvas 并使文档页边距适合图形。
也许您想改变方法并使用不同于散点图的方法,将低采样数据集的任务留给 Numpy 和 Matplotlib — 换句话说,使用 Numpy 的 histogram2d
和 Matplotlib 的 imshow
x, y = [p.random.normal(size=100000) for _ in (4, 34)]
h, xedge, yedge = np.histogram2d(x, y, bins=25)
cmap = plt.get_cmap('Greys')
plt.imshow(h, interpolation='lanczos', origin='low', cmap=cmap,
extent=[xedge[0], xedge[-1], yedge[0], yedge[-1]])
plt.savefig('Figure1.pdf') # → 30384 bytes
网格排列(这次使用hexbin
)
np.random.seed(20190308)
fig, axes = plt.subplots(3, 2, figsize=(4,6),
subplot_kw={'xticks': [], 'yticks': []})
fig.subplots_adjust(hspace=0.05, wspace=0.05)
for ax in axes.flat:
ax.hexbin(*(np.random.normal(size=10000) for _ in ('x', 'y')), cmap=cmap)
在 matplotlib 中绘制散点图并保存为矢量格式(在本例中为 PDF)时,生成的文件大小随点数缩放。
因为我有很多重叠点很多的点,所以我设置了alpha=.2
来查看点的分布有多密集。在中心区域,这导致显示的颜色等于 alpha=1
.
在将图形保存到矢量化文件时,有什么方法可以"crop"这些区域(f.i。通过组合指定距离内的重叠点),所以保存某种区域保存每个单点?
我忘了说:因为我需要绘制多个变量的相关性,所以我需要一个 (n x n) 散点图矩阵,其中 n
是变量的数量。这阻碍了 hexbin
或其他方法的使用,因为我必须自己创建一个完整的绘图网格。
例如:
fig_sc = plt.figure(figsize=(5, 5))
ax_sc = fig_sc.gca()
ax_sc.scatter(
np.random.normal(size=100000),
np.random.normal(size=100000),
s=10, marker='o', facecolors='none', edgecolors='black', alpha=.3)
fig_sc.savefig('test.pdf', format='pdf')
这导致文件大小约为 1.5MB,因为每个点都被保存了。我可以通过合并重叠点以某种方式 "reduce" 这张图片吗?
我尝试了几个选项,例如设置 dpi=300
和 transparence=False
,但由于 PDF 将图形存储为矢量化图像,这自然不会改变任何东西。
可能有用但有缺点的东西:
- hexbin 图:如果正确调整了分辨率和 cmap,则适用于单个散点图,但我想用 (n x n) 散点图绘制散点矩阵。没有 hexbin 矩阵图。
- 保存为光栅化格式:这些图适用于尽可能要求矢量化图的期刊。因此,我想避免将图像存储为光栅化图像。
- 随机提取部分数据:可能有效,但会改变绘图的外观。
有什么想法吗?
提前致谢!
这可能是作弊,但您可以将其保存为 .png 文件,然后通过 Latex 将其插入 pdf canvas 并使文档页边距适合图形。
也许您想改变方法并使用不同于散点图的方法,将低采样数据集的任务留给 Numpy 和 Matplotlib — 换句话说,使用 Numpy 的 histogram2d
和 Matplotlib 的 imshow
x, y = [p.random.normal(size=100000) for _ in (4, 34)]
h, xedge, yedge = np.histogram2d(x, y, bins=25)
cmap = plt.get_cmap('Greys')
plt.imshow(h, interpolation='lanczos', origin='low', cmap=cmap,
extent=[xedge[0], xedge[-1], yedge[0], yedge[-1]])
plt.savefig('Figure1.pdf') # → 30384 bytes
网格排列(这次使用hexbin
)
np.random.seed(20190308)
fig, axes = plt.subplots(3, 2, figsize=(4,6),
subplot_kw={'xticks': [], 'yticks': []})
fig.subplots_adjust(hspace=0.05, wspace=0.05)
for ax in axes.flat:
ax.hexbin(*(np.random.normal(size=10000) for _ in ('x', 'y')), cmap=cmap)