求助:使用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
相关产品推荐
相关产品推荐

