You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用循环+ax.twinx()实现Matplotlib多Y轴同X轴绘图?

多Y轴动态绘图的常规实现方法

核心就是用数组存储所有轴对象——因为每次新增Y轴都依赖前一个轴的twinx()方法,没存轴数组会导致后续循环找不到对应轴,触发报错。以下是基于Pandas和Matplotlib的标准实现步骤:

1. 导入依赖并读取CSV

import pandas as pd
import matplotlib.pyplot as plt

# 读取CSV,假设第一列为X轴数据,其余为待绘制的Y列
df = pd.read_csv('your_data.csv')
x_col = df.columns[0]
y_cols = df.columns[1:]

2. 初始化绘图与轴数组

先创建第一个主轴,并存入数组,后续所有新轴都基于这个数组里的前一个轴生成:

fig, ax = plt.subplots(figsize=(10, 6))
# 初始化轴列表,保存所有生成的Y轴对象
axes = [ax]

# 绘制第一列Y数据
axes[0].plot(df[x_col], df[y_cols[0]], color='tab:blue', label=y_cols[0])
axes[0].set_xlabel(x_col)
axes[0].set_ylabel(y_cols[0], color='tab:blue')
axes[0].tick_params(axis='y', labelcolor='tab:blue')

3. 循环生成多Y轴并绘图

遍历剩余Y列,每次用前一个轴的twinx()创建新轴,并存入数组:

# 定义颜色池,区分不同Y轴
colors = ['tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown']

for idx, y_col in enumerate(y_cols[1:], start=1):
    # 基于前一个轴创建双Y轴
    new_ax = axes[idx-1].twinx()
    axes.append(new_ax)
    
    # 绘制当前Y列数据
    new_ax.plot(df[x_col], df[y_col], color=colors[idx % len(colors)], label=y_col)
    new_ax.set_ylabel(y_col, color=colors[idx % len(colors)])
    new_ax.tick_params(axis='y', labelcolor=colors[idx % len(colors)])

4. 合并图例并展示

多个轴的图例需要手动合并,避免重叠:

# 收集所有轴的图例元素
lines, labels = [], []
for ax in axes:
    ax_lines, ax_labels = ax.get_legend_handles_labels()
    lines.extend(ax_lines)
    labels.extend(ax_labels)

# 添加合并后的图例
fig.legend(lines, labels, loc='upper right', bbox_to_anchor=(1.15, 1))

plt.tight_layout()
plt.show()

关键注意事项

  • 必须用数组保存所有轴对象,否则循环中创建的新轴会被覆盖,导致后续操作报错
  • 如果X轴是时间格式,先转成datetime类型:df[x_col] = pd.to_datetime(df[x_col])
  • Y轴过多时,可调整图例位置或简化颜色,避免图表拥挤

内容的提问来源于stack exchange,提问作者Ben Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:22:06