减少多重叠点矢量散点图和alph的磁盘大小

2024-04-27 03:41:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

因为我有很多点有大量的重叠点,所以我设置alpha=.2来看看这些点的分布有多密集。在中心区域,这将导致显示的颜色与alpha=1的外观相等。你知道吗

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

我忘记提到的是:因为我需要绘制多个变量的相关性,所以我需要一个(nxn)散点图矩阵,其中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)散点图绘制散点矩阵。没有hexbin矩阵图。你知道吗
  • 保存为光栅化格式:这些绘图是为要求矢量化绘图的日记本准备的。因此,我希望避免将图像存储为光栅化图像。你知道吗
  • 随机抽取部分数据:可能有效,但会改变绘图的外观。你知道吗

有什么想法吗?
提前谢谢!你知道吗


Tags: 方法图像alpha图形区域绘图pdf格式
2条回答

这可能是一个欺骗,但你可以保存它作为一个.png文件,然后插入到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]])

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

相关问题 更多 >