【问题标题】:Set properties for specific patch in matplotlib.collections.PathCollection在 matplotlib.collections.PathCollection 中设置特定补丁的属性
【发布时间】:2016-09-15 12:40:56
【问题描述】:

我想为matplotlib.collections.PathCollection 的特定元素设置单独的属性(例如zorderlabel)。我在文档中找不到方法。

我在这里记下了一个用户案例。
假设我们有以下 sn-p,我们想更改 red 球的 zorder,通过使用 balls 句柄将其带到顶部,这是一个matplotlib.collections.PathCollection.

balls = plt.scatter([-1, 1], [0, 0], c = ['r', 'b'], s = 4e4)
plt.axis([-5, 5, -5, 5])

有人知道如何调整PathCollection 的各个路径吗?

替代方法是使用plt.plot('o'),它实际上返回一个list 句柄。不幸的是,plt.plot('o') 解决方案不允许我为每个球设置不同的颜色,因为它们都属于同一个图表。所以需要一个for 循环。

我敢打赌,从截止日期开始,我会采用的激进解决方案是 Inkscape :/

【问题讨论】:

    标签: python matplotlib plot scatter z-order


    【解决方案1】:

    不确定这是否是最佳解决方案,但它可能会对您有所帮助。

    据我所知,PathCollection 中的paths 始终按照它们的创建顺序绘制。因此,在您的情况下,首先创建 x 位置为 -1path,然后创建带有 1path

    您可以在最初绘制它们后切换该顺序,通过更改offsets,在您的情况下使用balls.set_offsets()

    In [4]: balls = plt.scatter([-1, 1], [0, 0], c = ['r', 'b'], s = 4e4)
    In [5]: plt.axis([-5, 5, -5, 5])
    

    这将创建下图:

    In [42]: print balls.get_offsets()
    [[-1.  0.]
     [ 1.  0.]]
    
    On [43]: balls.set_offsets([[1,0],[-1,0]])
    

    现在,左手球在右手球之上:

    但是正如你所看到的,这也切换了facecolors(因为我们在对plt.scatter 的调用中将它的顺序设置为['r','b']。对此有一个解决方案,也就是切换facecolors左右:

    In [46]: balls.set_facecolors(['b','r'])
    


    太好了,所以综合起来,我们可以定义一个函数来切换PathCollection 中任意两个paths 的偏移量和面色。

    import matplotlib.pyplot as plt
    
    fig,ax = plt.subplots()
    balls = ax.scatter([-3, -1, 1, 3], [0, 0, 0, 0], c = ['r', 'b', 'g', 'm'], s = 4e4)
    ax.set_xlim(-6,6)
    ax.set_ylim(-6,6)
    
    plt.savefig('balls_01.png')
    
    def switch_scatter(pathcoll,a,b):
    
        # Switch offsets
        offsets = pathcoll.get_offsets()[:]
        offsets[[a,b]] = offsets[[b,a]]
    
        # Switch facecolors
        facecolors = pathcoll.get_facecolors()
        facecolors[[a,b]] = facecolors[[b,a]]
    
        # Switch sizes 
        sizes = pathcoll.get_sizes() 
        sizes[[a,b]] = sizes[[b,a]] 
    
        # Set the new offsets, facecolors and sizes on the PathCollection
        pathcoll.set_offsets(offsets)
        pathcoll.set_facecolors(facecolors)
        pathcoll.set_sizes(sizes)
    
    switch_scatter(balls,2,1)
    
    plt.savefig('balls_02.png')
    

    这是balls_01.png:

    这里是balls_02.png(我们在这里交换球 1 和球 2(蓝色和绿色球)


    最后一点:如果散点图中的其他属性(例如线条颜色)有所不同,您还需要在我上面定义的函数中切换它们。

    【讨论】:

    • 天啊!惊人的!发生的事情是一个小球隐藏在一个更大的球下,我想避免改变我的数据和颜色的顺序,因为它们在其他地方使用。在线图中,我确实使用了zorder,但在这里我无法以同样的方式处理这种情况。我会使用你的解决方案,但我会在截止日期后尝试理解你的功能,尽管英文解释完全有道理。非常感谢您关注我的背影!
    • 问题:你是怎么知道offsets的?只是为了了解你的作案手法。
    • 完整:# Switch sizes sizes = pathcoll.get_sizes() sizes[[a,b]] = sizes[[b,a]] 然后pathcoll.set_sizes(sizes)
    • 谢谢。我会将其编辑为答案。我发现offsets 只是在balls 集合上按制表符完成以查看它具有哪些属性,然后找到看起来正确的那个。如果您查看balls.properties(我认为),它是一本包含所有属性的字典,因此您可以快速找到所需的。
    • 大声笑,好的。我期待一个更花哨的答案,哈哈! NIPS 2016 截止日期为 2 小时。让我们试着回顾一下这个杰作,哈哈!我正在考虑将您添加到 Acknowledgements 部分;)您有名字吗,或者您会成为“stackoverflow 用户”吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多