双y轴图在实际科研过程中比较常见。但我们常常会为了要把某个图形置于顶层,又或者是要把某个图形对应的y轴固定在某一侧而感到烦恼。别怕,今天这篇推文将会解决你的疑虑!
首先,我们先来绘制一个正常的双y轴图。从图中可以看到,红色的三角函数是在底层,而蓝色的直线是在顶层。
代码语言:javascript复制#method 1
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10,10,0.01)
fig, ax1 = plt.subplots( 1, 1, figsize=(9,3) )
ax1.plot( x, np.sin(x), color='red', linewidth=10)
ax2 = ax1.twinx()
ax2.plot( x, x, color='blue', linewidth=10)
现在,我们希望让图中红色的三角函数置于顶层,而蓝色的直线位于底层。要实现这个目的,我们仅需要调整画图顺序。用ax1先绘制直线,再用ax2绘制三角函数。
代码语言:javascript复制#method 2
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10,10,0.01)
fig, ax1 = plt.subplots( 1, 1, figsize=(9,3) )
ax1.plot( x, x, color='blue', linewidth=10)
ax2 = ax1.twinx()
ax2.plot( x, np.sin(x), color='red', linewidth=10)
对比方法2与方法1所绘制图的y轴坐标可以发现,虽然图形的显示层级(底层和顶层)发生了变化,但y轴也随之发生了对调。有没有什么方法可以让让y轴固定不动的同时,显示层级发生变化呢?
下面这个方法3在方法1的基础上,给出了facecolor的妙用。首先zorder控制图层顺序,其值越大,所对应图层越接近顶层(也就是表面层)。我们通过设置ax1的zorder为2,将其置于顶层。但由于每一个图层默认其facecolor是白色的,如果我们不对其进行设置,那底层的ax2直线图形就会被遮挡导致不可见。因此,我们通过设置ax1的facecolor为“none”,也就是无facecolor后,我们想要的效果就呈现出来了。
代码语言:javascript复制#method3
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10,10,0.01)
fig, ax1 = plt.subplots( 1, 1, figsize=(9,3) )
ax1.plot( x, np.sin(x), color='red', linewidth=10)
ax1.set_facecolor('none')
ax2 = ax1.twinx()
ax2.plot( x, x, color='blue', linewidth=10)
ax1.set_zorder(2)
ax2.set_zorder(1)
除此以外,还有一种较简单的方法可以实现这个目的。那就是在方法2的基础上,通过 ax.yaxis.tick_left() 和 ax.yaxis.tick_right()对调两个y轴的label。
代码语言:javascript复制#method4
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10,10,0.01)
fig, ax1 = plt.subplots( 1, 1, figsize=(9,3) )
ax1.plot( x, x, color='blue', linewidth=10)
ax2 = ax1.twinx()
ax2.plot( x, np.sin(x), color='red', linewidth=10)
ax1.yaxis.tick_right()
ax2.yaxis.tick_left()
以上就是本文的全部内容。非常感谢讨论群内各位气象人的热烈讨论!