社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

代码公开 | python绘制双y轴图的几种方法

happy科研 • 3 年前 • 260 次点击  

       双y轴图在实际科研过程中比较常见。但我们常常会为了要把某个图形置于顶层,又或者是要把某个图形对应的y轴固定在某一侧而感到烦恼。别怕,今天这篇推文将会解决你的疑虑!


       首先,我们先来绘制一个正常的双y轴图。从图中可以看到,红色的三角函数是在底层,而蓝色的直线是在顶层。

#method 1import numpy as npimport matplotlib.pyplot as pltx = 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绘制三角函数。

#method 2import numpy as npimport matplotlib.pyplot as pltx = 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后,我们想要的效果就呈现出来了。

#method3import numpy as npimport matplotlib.pyplot as pltx = 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。

#method4import numpy as npimport matplotlib.pyplot as pltx = 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()


       以上就是本文的全部内容。非常感谢讨论群内各位气象人的热烈讨论!


往期推荐

【公益】初衷

【公益】每周公示

CFL 错误、SIGSEGV 段错误以及挂起或停止

ProPlot3兰伯特投影-可添加刻度(三)

xarray库合集




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128666
 
260 次点击