Python matplotlib绘制子图时如何反转所有子图的Y轴
问题原因
plt.gca() 会返回当前处于激活状态的坐标轴对象,按顺序绘制3个子图时,只有最后绘制完成的p3会成为最终激活的坐标轴,因此调用plt.gca().invert_yaxis()时,操作的始终是最后一个子图,前两个子图不会被影响。
解决方案
不要通过全局的gca()方法获取坐标轴,直接操作每个子图对应的轴对象调用反转方法即可。
方法1:逐个对子图调用反转方法
直接在每个子图绘制完成后,调用该子图对象的invert_yaxis(),修正后可运行的代码如下:
import matplotlib.pyplot as plt import pandas import numpy as np # 创建1行3列的子图布局 fig, (p1, p2, p3) = plt.subplots(1, 3) # 第一个子图:陆源碎屑输入指标 p1.plot(Ti/Mg, xrf_depth) p1.set_title("Clastic influx (Ti/Mg) and Ti (ppm)") p1.invert_yaxis() # 第二个子图:Ti元素含量 p2.plot(Ti/1000, xrf_depth) p2.invert_yaxis() # 第三个子图:初级生产力指标 p3.plot(Ca/Si, xrf_depth, '-g') p3.set_title("Primary production (Ca/Si)") p3.invert_yaxis() plt.show()
注:原代码中
p3的标题字符串缺少右闭合括号,上述代码已同步修正。
方法2:批量遍历轴对象统一反转
如果子图数量较多,逐个子图写反转逻辑比较繁琐,可以在创建子图后遍历所有轴对象,统一执行Y轴反转:
import matplotlib.pyplot as plt import pandas import numpy as np # 创建子图时用axes接收所有轴对象的数组 fig, axes = plt.subplots(1, 3) # 批量反转所有子图Y轴 for ax in axes: ax.invert_yaxis() p1, p2, p3 = axes # 后续正常绘制每个子图的内容即可 p1.plot(Ti/Mg, xrf_depth) p1.set_title("Clastic influx (Ti/Mg) and Ti (ppm)") p2.plot(Ti/1000, xrf_depth) p3.plot(Ca/Si, xrf_depth, '-g') p3.set_title("Primary production (Ca/Si)") plt.show()
内容的提问来源于stack exchange,提问作者astrunk
相关产品推荐
相关产品推荐

