在matplotlib.collections.PathCollection中设置特定补丁的属性

时间:2016-05-18 20:32:03

标签: python matplotlib plot scatter z-order

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

我在这里记下用户案例 假设我们有以下代码段,并且我们想要更改红色球的zorder,并使用balls句柄将其置于顶部,这是matplotlib.collections.PathCollection

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

Overlapped balls

有没有人知道如何调整PathCollection的个别路径?

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

我敢打赌,在我的截止日期之前,我会打赌我会选择Inkscape:/

1 个答案:

答案 0 :(得分:1)

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

从我看到的情况来看,paths中的PathCollection始终按照创建顺序绘制。因此,在您的情况下,首先创建path的x位置-1,然后创建1的{​​{1}}。

您可以在最初绘制订单后切换该订单,在您的情况下使用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])

这会创建下图:enter image description here

In [42]: print balls.get_offsets()
[[-1.  0.]
 [ 1.  0.]]

On [43]: balls.set_offsets([[1,0],[-1,0]])

现在,这已经将左手球绘制在右手球的顶部:

enter image description here

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

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

enter image description here

很好,所以把它们放在一起,我们可以定义一个函数来切换paths中任意两个任意PathCollection的偏移和面部颜色。

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')

Heres balls_01.png

enter image description here

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

enter image description here

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