减少具有许多重叠点和alpha的矢量化散点图在磁盘上的大小

时间:2019-03-08 13:51:45

标签: python matplotlib scatter-plot vector-graphics

在matplotlib中绘制散点图并保存为矢量格式(在本例中为PDF)时,生成的文件大小随点数成比例。

由于我有很多点,并且有很多重叠点,因此我设置alpha=.2来查看点的分布密度。在中央区域,这将导致显示的颜色等于alpha=1的外观。

将图形保存到矢量化文件时,是否有任何方法可以“裁剪”这些区域(通过组合指定距离内的重叠点),因此可以保存某种区域而不是保存每个点?

我忘了提的是:由于我需要绘制多个变量的相关性,因此我需要一个(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。我可以通过合并重叠点以某种方式“缩小”此图像吗?

我尝试了几种选项,例如设置dpi=300transparence=False,但是由于PDF将图形存储为矢量图像,因此自然不会发生任何变化。

可能有用但有缺点的东西

  • hexbin图:如果正确调整了分辨率和cmap,则可用于单个散点图,但是我想用(n x n)个散点图绘制散点矩阵。没有afaik没有hexbin-matrix图。
  • 保存为栅格化格式:地块适用于期刊,该期刊会尽可能请求矢量化地块。因此,我想避免将图像存储为光栅图像。
  • 随机提取部分数据:可能有用,但会改变图的外观。

有什么想法吗?
预先感谢!

2 个答案:

答案 0 :(得分:1)

也许您想更改方法并使用与散点图不同的方法,而将数据集的低采样任务留给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]])

enter image description here

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) 

enter image description here

答案 1 :(得分:0)

这可能是一个作弊,但您可以将其另存为.png文件,然后通过乳胶将其插入pdf画布,并使文档页边距适合图形。