【问题标题】:matplotlib remove unseen shapesmatplotlib 删除看不见的形状
【发布时间】:2012-11-01 13:40:01
【问题描述】:

我想知道是否可以删除被其他形状完全覆盖的任何形状? 我经常生成粒子的散点图,其中一些粒子彼此靠近,并且由于粒子的数量很容易达到 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 > 5s (2.4MB)

N=20000 > 10 秒 (4.8MB)

N=40000 > 20s (9.5MB)

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

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

【问题讨论】:

    标签: python matplotlib scatter-plot


    【解决方案1】:

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

    根据我的经验,大多数人不会在 PDF 中放大太多,以便在矢量和图像之间产生差异。此外,您的矢量素材足够重,可以证明在不增加文件大小的情况下使用更高 DPI 图像是合理的。

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

    plt.scatter(x, y)
    

    你可以的

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

    试试看!

    希望这会有所帮助!

    【讨论】:

    • 我同意透明度。隐藏大部分数据很奇怪,并且暗示了其他可视化方法。除了透明度之外,您还可以尝试将其显示为具有类似 np.histogram2d() 的密度图,但这会将颜色维度作为第三个变量移除。
    • 感谢您的回答。这就是我现在使用的方法,但我真的希望能够将绘图保留在矢量图形中。
    • 透明度看起来不错,所以如果我必须将其保存为光栅图形,我可能会这样做。
    • 我非常能理解您保持“矢量”或更“规范”的意愿,因为我也是这么想的。但是要考虑的一件事是,当粒度增加太多时,有一个点实际上更规范的是使用适当的 DPI 光栅而不是矢量。 (例如,想象将照片保存为矢量......)。此外,如果您不需要透明度,可以在绘图之前使用一些空间整理算法,例如使用 scipy.spatialKDTreedistance 函数的算法。
    • 谢谢,我会研究这些功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2016-06-16
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多