matplotlib.PatchCollection始终最后绘制

0 投票
1 回答
919 浏览
提问于 2025-04-17 13:35

我有一个 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()

我希望我的图形集合中的图形先画出来,然后再画 selctionRectbrushShape,因为它们可能会覆盖到集合中的图形。如果它们重叠了,应该能看得见。但是,我的图表总是把集合中的图形显示得像是最后画的一样。我该怎么解决这个问题呢?任何帮助都很感谢。

编辑:有一个方法似乎有效,就是保持两个图形集合。但是,当我这样做的时候,似乎我永远无法把它们的可见性设置为假。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)

zorder 示例

撰写回答