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

求助:使用Matplotlib动态绘制Excel列数据的多Y轴图表并合理分配左右轴

解决Matplotlib多Y轴按规则分布的问题

需求与问题

  • 动态绘制Excel各列数据,多Y轴需遵循以下规则:
    • 数据列数为偶数时,均匀分布在图表左右两侧
    • 数据列数为奇数时,右侧轴的数量比左侧多一个
  • 现有代码无法正确将轴放置在左侧,多数轴集中在右侧

修正后的代码

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 模拟Excel数据(实际使用时替换为pd.read_excel("你的文件路径.xlsx"))
total_cols = 5  # 可修改为任意列数测试
data = [np.random.random(10) * i for i in range(total_cols)]
df = pd.DataFrame(np.array(data).T, columns=[f'label{i+1}' for i in range(total_cols)])

colors = ['black', 'red', 'blue', 'green', 'purple', 'orange', 'cyan'][:total_cols]
labels = df.columns.tolist()

fig, ax_orig = plt.subplots(figsize=(10, 5))
axes = [ax_orig]

# 计算左右侧轴的数量
left_count = total_cols // 2
right_count = total_cols - left_count

# 创建左侧额外轴(除原始轴外)
for i in range(1, left_count + 1):
    ax = ax_orig.twinx()
    # 左侧轴向外偏移,每次递增50像素
    ax.spines['left'].set_position(('outward', 50 * i))
    # 隐藏右侧轴线,避免干扰
    ax.spines['right'].set_visible(False)
    # 指定刻度和标签显示在左侧
    ax.yaxis.set_ticks_position('left')
    ax.yaxis.set_label_position('left')
    axes.append(ax)

# 创建右侧轴
for i in range(right_count):
    ax = ax_orig.twinx()
    # 右侧轴向外偏移,从0开始递增50像素
    ax.spines['right'].set_position(('outward', 50 * i))
    # 隐藏左侧轴线
    ax.spines['left'].set_visible(False)
    axes.append(ax)

# 绘制每列数据并配置样式
for ax, arr, color, label in zip(axes, df.values.T, colors, labels):
    ax.plot(arr, color=color, marker='o')
    ax.set_ylabel(label, color=color)
    ax.tick_params(axis='y', colors=color)
    # 仅原始轴保留X轴刻度,其他轴隐藏
    if ax != ax_orig:
        ax.set_xticks([])

fig.tight_layout()
plt.show()

核心改进点

  • 轴数量分配:通过total_cols // 2计算左侧轴数量,右侧数量为总列数减左侧数量,自动满足奇偶列的分布规则
  • 左侧轴配置:新建左侧轴时强制隐藏右侧脊柱(spine),并将刻度、标签固定在左侧,按顺序设置偏移量,避免轴重叠
  • 右侧轴配置:新建右侧轴时隐藏左侧脊柱,按顺序设置右侧偏移量,保证轴均匀分布
  • X轴优化:仅原始轴显示X轴刻度,避免多轴重复显示造成混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:12:51