在matplotlib中绘制散点图并保存为矢量格式(在本例中为PDF)时,生成的文件大小将按点数进行缩放。
由于我有很多具有大量重叠点的点,我设置alpha=.2
以查看点的分布密集程度。在中心区域,这导致显示的颜色等于alpha=1
的外观。
在将图形保存到矢量化文件时,有没有办法“裁剪”这些区域(f.i.通过组合指定距离内的重叠点),这样可以保存某种区域而不是保存每一个点?
我忘了提到:由于我需要绘制多个变量的相关性,我需要一个(n×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。我可以通过组合重叠点以某种方式“减少”这个图像吗?
我尝试了几个选项,比如设置dpi=300
和transparence=False
,但由于PDF将图形存储为矢量化图像,这自然不会改变任何东西。
可能有用的东西,但有缺点:
有任何想法吗? 提前致谢!
也许你想改变你的方法并使用与散点图不同的东西,让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)
这可能是作弊,但您可以将其保存为.png文件,然后通过乳胶将其插入pdf画布并使文档边距适合图形。