Skip to main content
 首页 » 编程设计

python之matplotlib 删除看不见的形状

2025年05月04日7sky-heaven

我想知道是否可以移除任何被其他形状完全覆盖的形状? 我经常生成粒子的散点图,其中一些粒子彼此靠近,并且由于粒子的数量很容易达到 100k,因此这些图变得非常庞大。

考虑以下简单示例:

    import matplotlib.pyplot as plt 
    import numpy as np 
    N = 10000 
    x = np.random.randn(N) 
    y = np.random.randn(N) 
    plt.scatter(x,y) 
    plt.savefig('unseen.pdf') 

当使用大于 10000 的 N 值时,大部分圆圈位于其他圆圈下方并且看不见。但是,当打开生成的 pdf 文件时,会绘制所有圆圈,并且打开文件的时间会增加,即使可见圆圈的数量几乎相同也是如此。

在 pdf-viewer 中打开图形的时间(无论哪个):

N=10000 > 5 秒 (2.4MB)

N=20000 > 10 秒 (4.8MB)

N=40000 > 20 秒 (9.5MB)

时间和文件大小都线性增加,正如预期的那样,增加圆圈数。

有没有人知道如何解决这个问题?

请您参考如下方法:

我认为您应该将绘图保存为光栅图像,然后将其嵌入到 pdf 中(cairo 模块效果很好)。

根据我的经验,大多数人不会在 PDF 中缩放太多以区分矢量和图像。此外,您的矢量内容足够重,足以证明在不增加文件大小的情况下使用更高 DPI 图像是合理的。

此外,一个好的技巧是使用 ms(标记大小)和 mew(标记边缘宽度)和 alpha 绘制无边框的透明圆圈> 关键字参数。视觉效果令人惊叹。而不是

plt.scatter(x, y) 

你可以做到

plt.plot(x, y, 'o', ms=3, mew=0, alpha=0.3) 

试试看!

希望这对您有所帮助!