从两个轴上交换各个艺术家的zorders

时间:2018-02-05 10:01:44

标签: python matplotlib

我有一个图,我在其上绘制两个轴对象,ax1ax2,其中ax2 = ax1.twinx()

如何在每个轴上交换个别艺术家的zorders?例如,我希望ax1中的一位艺术家处于背景中,然后让所有来自ax2的艺术家,然后从ax1绘制其余的艺术家。作为一个例子,我想按照它的编写顺序绘制以下内容(即(x3, y3)(x2, y2)之上的(x1, y1)

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(x1, y1)
ax2.plot(x2, y2)
ax1.plot(x3, y3)

如何做到这一点?

This answer显示了如何反转轴的zorders,但不显示单个项目的zorders。

1 个答案:

答案 0 :(得分:3)

你不能简单地调整艺术家跨轴的z顺序。属于一个Axes的艺术家的z顺序仅与该轴相关。

但是,您可以获得所需的效果,但不容易。这有两个选择:

使用3轴

在我看来,最简单的方法是使用3个轴,第3个轴是完整的"克隆"第一个,但z顺序高于ax2

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ax3 = fig.add_axes(ax1.get_position(), sharex=ax1, sharey=ax1)
ax3.set_facecolor('none') #prevents axes background from hiding artists below
ax3.set_axis_off() # pervents superimposed ticks from being drawn

l_bottom, = ax1.plot([1,2,3], [4,6,6], lw=10, c='C1')
l2, = ax2.plot([1,2,3], [60,30,40], lw=10, c='C2')
l_top, = ax3.plot([1,2,3],[5,10,3], lw=10, c='C3')
ax3.legend([l_bottom, l2, l_top],['left','right','left'])
ax3.set_title('using a 3rd axe')

enter image description here

使用转换

此方法仅使用2个轴,但使用ax2的数据坐标绘制ax1上的绿线。该方法的问题是ax1不会自动自动缩放,因此需要调用set_ylim()。此外,它可能会在更大的代码中变得相当混乱,以跟踪哪个变换器被哪个艺术家使用。

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

l_bottom, = ax1.plot([1,2,3], [4,6,6], lw=10, c='C1')
l2, = ax2.plot([1,2,3], [60,30,40], lw=10, c='C2')
l_top, = ax2.plot([1,2,3],[5,10,3], lw=10, c='C3',transform=ax1.transData)
ax1.set_ylim(2.65,10.35)  # matches the limits on the previous graph
ax2.set_ylim(28.5,61.5)
ax2.legend([l_bottom, l2, l_top],['left','right','left'])
ax2.set_title('using transforms')

enter image description here