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

Set properties for specific patch in matplotlib.collections.PathCollection

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

在这里我记下了一个用户案例。
假设我们有以下代码片段,我们想更改 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'),实际上 returns 一个 list 句柄。不幸的是,plt.plot('o') 解决方案不允许我为每个球设置不同的颜色,因为它们都属于同一个图表。所以需要一个 for 循环。

我敢打赌,从我的截止日期开始,我会选择的极端解决方案是 Inkscape :/

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

据我所知,PathCollection 中的 paths 总是按照它们创建的顺序绘制。因此,在您的情况下,首先创建 x 位置为 -1path,然后是 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])

这将创建下图:

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(蓝色和绿色球)


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