使用循环为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
相关产品推荐
相关产品推荐

