为 matplotlib.collections.PathCollection 中的特定补丁设置属性
Set properties for specific patch in matplotlib.collections.PathCollection
我想为 matplotlib.collections.PathCollection
的特定元素设置单独的属性(例如 zorder
和 label
)。我在文档中找不到方法。
在这里我记下了一个用户案例。
假设我们有以下代码片段,我们想更改 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 位置为 -1
的 path
,然后是 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(蓝色和绿色球)
最后一点:如果您的散点图中有其他不同的属性(例如线条颜色),您还需要在我上面定义的函数中切换它们。
我想为 matplotlib.collections.PathCollection
的特定元素设置单独的属性(例如 zorder
和 label
)。我在文档中找不到方法。
在这里我记下了一个用户案例。
假设我们有以下代码片段,我们想更改 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 位置为 -1
的 path
,然后是 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(蓝色和绿色球)
最后一点:如果您的散点图中有其他不同的属性(例如线条颜色),您还需要在我上面定义的函数中切换它们。