我想为zorder
的特定元素设置单独的属性(例如label
和matplotlib.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])
有谁知道如何调整
PathCollection
的各个路径?另一种选择是使用
plt.plot('o')
,它实际上返回一个list
句柄。不幸的是,plt.plot('o')
解决方案不允许我为每个球设置不同的颜色,因为它们都属于同一图表。因此,将需要一个for
循环。我敢打赌,自从我的截止日期以来,我会去解决这个难题,那就是Inkscape:/
最佳答案
不知道这是否是最好的解决方案,但它可能会为您提供帮助。
从我所看到的,paths
中的PathCollection
总是按照它们创建的顺序绘制。因此,在您的情况下,将首先创建x位置为path
的-1
,然后创建具有1
的offsets
。
您可以在最初绘制它们后通过更改balls.set_offsets()
来切换该顺序,在这种情况下,请使用facecolors
:
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]])
现在,这已将左手球绘制在右手球的顶部:
但是,您可以看到,这也改变了
plt.scatter
的位置(因为我们将对['r','b']
的调用的顺序设置为facecolors
。对此有一个解决方案,那就是也可以切换paths
周围:In [46]: balls.set_facecolors(['b','r'])
太好了,将它们放在一起,我们可以定义一个函数来切换
PathCollection
中任何两个任意balls_01.png
的偏移量和面色。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_02.png
:这是(我们在其中切换球1和球2(蓝色和绿色球)
最后一点:如果散点图中的其他属性有所不同(例如,线色),则还需要在我上面定义的函数中进行切换。
关于python - 在matplotlib.collections.PathCollection中设置特定补丁的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37309578/