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

使用循环为DataFrame多列批量生成r与dr对比子图的实现方案

实现方案

你可以通过提取列名的公共后缀自动配对r和dr列,再通过循环批量生成子图,参考实现代码如下:

import pandas as pd
import matplotlib.pyplot as plt

# 第一步:提取所有配对列的公共后缀(即dr、r后的数字)
suffixes = sorted({
    col[2:] if col.startswith('dr') else col[1:] 
    for col in df.columns
})
# 此时suffixes为 ['1','9','21','26','32','37','49','52','105','118'],共10组配对

# 第二步:设置子图布局,可根据需求调整行列数、画布大小
n_rows = 2
n_cols = 5
fig, axes = plt.subplots(nrows=n_rows, ncols=n_cols, figsize=(22, 8))
axes = axes.flatten() # 把二维的子图数组转为一维,方便循环索引

# 第三步:循环绘制每个分组的对比图
for idx, suf in enumerate(suffixes):
    dr_col = f'dr{suf}'
    r_col = f'r{suf}'
    ax = axes[idx]
    
    # 两个系列数值差距大,推荐使用双Y轴避免其中一个系列被压缩
    # 左Y轴对应dr列
    ax_dr = ax
    ax_dr.plot(df.index, df[dr_col], color='#1f77b4', label=dr_col)
    ax_dr.set_ylabel(f'{dr_col} 数值', color='#1f77b4', fontsize=9)
    ax_dr.tick_params(axis='y', labelcolor='#1f77b4')
    ax_dr.set_xlabel('索引', fontsize=9)
    
    # 右Y轴对应r列
    ax_r = ax.twinx()
    ax_r.plot(df.index, df[r_col], color='#ff7f0e', label=r_col)
    ax_r.set_ylabel(f'{r_col} 数值', color='#ff7f0e', fontsize=9)
    ax_r.tick_params(axis='y', labelcolor='#ff7f0e')
    
    # 设置子图标题、合并图例
    ax.set_title(f'分组{suf}:dr与r对比', fontsize=10)
    lines1, labels1 = ax_dr.get_legend_handles_labels()
    lines2, labels2 = ax_r.get_legend_handles_labels()
    ax.legend(lines1 + lines2, labels1 + labels2, loc='upper right', fontsize=8)

# 隐藏可能多余的空白子图(如果布局行列数大于实际配对数)
for ax in axes[len(suffixes):]:
    ax.axis('off')

# 自动调整子图间距
plt.tight_layout()
plt.show()

可调整项说明

  • 你可以根据自己的绘图需求替换plot为bar/scatter等其他绘图方法
  • 子图行列数n_rows、n_cols可根据实际分组数量灵活调整
  • 如果两个系列数值范围接近,也可以去掉双Y轴逻辑,直接在同一个轴上绘制两个系列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:02