不确定这是否是最佳解决方案,但它可能会对您有所帮助。
据我所知,PathCollection 中的paths 始终按照它们的创建顺序绘制。因此,在您的情况下,首先创建 x 位置为 -1 的 path,然后创建带有 1 的 path。
您可以在最初绘制它们后切换该顺序,通过更改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(蓝色和绿色球)
最后一点:如果散点图中的其他属性(例如线条颜色)有所不同,您还需要在我上面定义的函数中切换它们。