matplotlib.PatchCollection始终最后绘制
我有一个 matplotlib.PatchCollection
,想把它加到一个图表上。不过,我还在图表上直接添加了一些文本和其他图形。所以现在的情况是这样的:
node.shape = RegularPolygon((node.posX, node.posY),
6,
radius = node.radius,
edgecolor = 'none',
facecolor = node.fillColor,
zorder = node.zorder)
self.patches.append(node.shape)
self.p = PatchCollection(self.patches, edgecolor = 'none', match_original=True )
self.plotAxes.add_collection(self.p)
#Two previously instantiated patches (they are visible)
self.plotAxes.add_artist(selectionRect)
self.plotAxes.add_artist(brushShape)
self.plotCanvas.draw()
我希望我的图形集合中的图形先画出来,然后再画 selctionRect
和 brushShape
,因为它们可能会覆盖到集合中的图形。如果它们重叠了,应该能看得见。但是,我的图表总是把集合中的图形显示得像是最后画的一样。我该怎么解决这个问题呢?任何帮助都很感谢。
编辑:有一个方法似乎有效,就是保持两个图形集合。但是,当我这样做的时候,似乎我永远无法把它们的可见性设置为假。PatchCollection
是不是会重置这些值或者其他什么的?
1 个回答
1
正如亚当在评论中提到的,你需要设置 zorder
,这个参数决定了当多个东西重叠时,它们的绘制顺序。zorder
值越高的东西会覆盖 zorder
值较低的东西。
每个元素都有一个默认的 zorder
值,但你可以通过在函数调用中添加 zorder
这个参数来覆盖它。这个参数是 Artist
的一个选项,所以基本上所有的绘图函数都会遵循这个规则(如果你发现有不遵循的,记得去 GitHub 提交一个bug报告)。
例如:
plt.figure()
ax = plt.gca()
ax.plot(range(5), zorder=2, lw=10)
ax.plot(range(5)[::-1], zorder=1, lw=10)
与之相比:
plt.figure()
ax = plt.gca()
ax.plot(range(5), zorder=1, lw=10)
ax.plot(range(5)[::-1], zorder=2, lw=10)