同列名双DataFrame按列循环绘制散点图时obs列不循环问题
问题根因
代码内层循环末尾的break语句是错误根源:每次内层for colobs in obs.columns第一次执行(colobs取到obs第一列)后,break会直接终止内层循环,因此永远只会用到obs的第一列数据。
同时你的需求是同列名配对绘图,不需要写双重循环,双重循环反而会引发列错配问题,直接单层遍历列名取对应同名列即可。
修正后代码
import pandas as pd import matplotlib.pyplot as plt import os obs = pd.read_csv(obsFile) obs.rename(columns={obs.columns[0]: "SP"}, inplace=True) sim = pd.read_csv(simFile) sim.rename(columns={sim.columns[0]: "SP"}, inplace=True) sim = sim.set_index("SP") obs = obs.set_index("SP") # 单层循环遍历列名,两个表列名一致直接取对应列即可 for col in sim.columns: axes = plt.gca() axes.set_xlim([1, 630]) # 新增label参数区分序列 plt.scatter(sim.index, sim[col], label='模拟值') plt.scatter(obs.index, obs[col], label='观测值') # 显示图例避免混淆序列 plt.legend() plt.xlabel('Stress Period') plt.ylabel('groundwater elevation(m)') plt.title(col) plt.savefig(os.path.join(outFold, f'{col}.pdf')) plt.close()
优化说明
- 新增图例标识,可直接区分模拟值和观测值散点序列
- 用f-string简化文件名拼接逻辑,可读性更高
- 删除冗余的双重循环和错误
break语句,执行效率更高,不会出现列错配问题
内容的提问来源于stack exchange,提问作者user11958450
相关产品推荐
相关产品推荐

