基于Matplotlib绘制3个不同刻度Y轴时间序列数据的问题求助
问题核心原因
你原代码的核心报错原因是变量覆盖错误:初始定义的ax1/ax2/ax3是坐标轴实例对象,后续调用plot方法时你直接把返回的折线对象赋值给了同名变量,导致后续调用坐标轴属性(如.yaxis、.spines)时找不到对应方法。
修正后可运行代码
import pandas as pd import matplotlib.pyplot as plt # 假设output_params是你的时间序列DataFrame,这里保留你的原有变量名 fig, ax1 = plt.subplots(figsize=(12,10)) # 生成三个Y轴,第三个Y轴向右偏移60像素避免重叠 ax2 = ax1.twinx() ax3 = ax1.twinx() ax3.spines['right'].set_position(('outward', 60)) # 1. 单独设置每个Y轴的刻度范围 ax1.set_ylim(0, 10) ax2.set_ylim(0, 100) ax3.set_ylim(0, 1000) # 设置Y轴标签 ax1.set_ylabel("Output Current") ax2.set_ylabel("Output Voltage") ax3.set_ylabel("Output Power") # 定义三个指标对应的颜色 color1 = plt.cm.viridis(0) color2 = plt.cm.viridis(0.5) color3 = plt.cm.viridis(.9) # 绘制折线,保留坐标轴变量,单独存折线对象用于图例 line1, = ax1.plot(output_params.index, output_params.Output_Current, color=color1, label= 'Output Current') line2, = ax2.plot(output_params.index, output_params.Output_Voltage, color=color2, label='Output Voltage') line3, = ax3.plot(output_params.index, output_params.Output_Power, color=color3, label='Output Power') # 2. 为每个Y轴的标签、刻度设置对应匹配的颜色 ax1.yaxis.label.set_color(color1) ax1.tick_params(axis='y', colors=color1) ax2.yaxis.label.set_color(color2) ax2.tick_params(axis='y', colors=color2) ax3.yaxis.label.set_color(color3) ax3.tick_params(axis='y', colors=color3) # 3. 合并所有折线的handle,统一展示图例 lines = [line1, line2, line3] ax1.legend(handles=lines, loc='best') # 自动调整布局避免标签被截断 fig.tight_layout() plt.show()
实现说明
- 单独调整Y轴范围:直接调用各个坐标轴的
set_ylim()方法即可,参数分别为最小值、最大值,可根据你的数据实际分布修改 - Y轴配色匹配:除了Y轴标签,额外添加了刻度颜色的匹配,视觉一致性更强
- 图例配置:单独存储每个
plot返回的折线对象,统一传入legend的handles参数即可正常显示所有指标的图例
优化建议
- 如果你的时间序列需要交互查看数值,可以用
plotly库实现多Y轴绘图,代码更简洁,还支持缩放、悬停看数值、导出图片等功能 - 若三个指标的波动趋势差异大,可以给每个Y轴添加网格线,注意网格线颜色和对应Y轴保持一致,避免视觉混乱
- 可以根据数据的实际量级自动计算
ylim,比如取对应指标最大值的1.1倍作为上限,避免硬编码范围适配性差的问题
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

