Matplotlib多子图如何用twinx实现双轴多刻度绘制温雨数据
在Matplotlib多子图中实现每个子图双轴(温度+降雨量)
嘿,这个需求其实很好解决——核心思路就是给每个子图单独调用twinx()创建右侧y轴,然后分别配置两个轴的刻度范围和绘图数据就行。下面我给你详细拆解,再附上可直接运行的代码示例:
关键步骤说明
- 创建子图布局:先用
plt.subplots()生成你需要的3个子图,得到子图数组axes。 - 遍历每个子图:对每个子图对象,调用
twinx()创建对应的右侧y轴,这样每个子图都有独立的双轴系统,互不干扰。 - 配置轴范围与绘图:
- 左侧轴绑定温度数据,设置刻度范围
[-5, 110]; - 右侧轴绑定降雨量数据,设置刻度范围
[0, 2]——因为这个范围刚好是你要的,所以降雨量的曲线会自动占满子图高度;
- 左侧轴绑定温度数据,设置刻度范围
- 添加标签与图例:为两个轴分别设置标签,避免混淆,图例可以分开添加或者合并显示。
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 生成模拟数据:假设3组时间序列数据 time = np.arange(0, 30, 1) # 3组温度数据(符合[-5,110]范围) temp_data = [ np.random.uniform(-5, 110, size=len(time)), np.random.uniform(-5, 110, size=len(time)), np.random.uniform(-5, 110, size=len(time)) ] # 3组降雨量数据(符合[0,2]范围) rain_data = [ np.random.uniform(0, 2, size=len(time)), np.random.uniform(0, 2, size=len(time)), np.random.uniform(0, 2, size=len(time)) ] # 创建3个子图布局(这里用1行3列,你也可以根据需要调整成其他布局) fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5)) # 遍历每个子图,逐个配置双轴 for idx, ax in enumerate(axes): # 绘制温度数据在左侧轴 line_temp, = ax.plot(time, temp_data[idx], color='tab:red', label='Temperature') # 设置左侧轴刻度范围 ax.set_ylim(-5, 110) ax.set_xlabel('Time') ax.set_ylabel('Temperature (°C)') ax.tick_params(axis='y', labelcolor='tab:red') # 创建右侧双轴 ax2 = ax.twinx() # 绘制降雨量数据在右侧轴 line_rain, = ax2.plot(time, rain_data[idx], color='tab:blue', label='Rainfall') # 设置右侧轴刻度范围(自动占满子图高度) ax2.set_ylim(0, 2) ax2.set_ylabel('Rainfall (mm)') ax2.tick_params(axis='y', labelcolor='tab:blue') # 合并两个轴的图例,避免重叠 ax.legend(handles=[line_temp, line_rain], loc='upper left') # 调整子图间距,避免标签重叠 fig.tight_layout() plt.show()
额外说明
- 如果你的子图布局是多行多列(比如2行2列),只需要把
enumerate(axes)改成enumerate(axes.flat)就能遍历所有子图; - 要是需要更定制化的样式(比如轴颜色、线条粗细),直接在
plot()或者tick_params()里调整参数就行; - 确保每个子图的
twinx()是独立创建的,这样不会出现多个子图共享同一个右侧轴的问题。
内容的提问来源于stack exchange,提问作者BarbaAlba
相关产品推荐
相关产品推荐

