我有一个图,我在其上绘制两个轴对象,ax1
和ax2
,其中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。
答案 0 :(得分:3)
你不能简单地调整艺术家跨轴的z顺序。属于一个Axes
的艺术家的z顺序仅与该轴相关。
但是,您可以获得所需的效果,但不容易。这有两个选择:
在我看来,最简单的方法是使用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')
此方法仅使用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')