如何使用for循环绘制列表数据与其对应索引的关系图?
场景1:所有csv的功率数据绘制在同一张图中对比
在现有代码末尾追加以下代码即可实现多曲线同图对比:
# 解决matplotlib中文显示问题,不需要可以删掉这两行 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(10, 6), dpi=100) # 遍历dfs列表,同时拿到列表索引和对应DataFrame数据 for list_idx, df in enumerate(dfs): # x轴传入数据的行索引,y轴传入功率列数值 plt.plot(df.index, df['Powermeter1 Start'], label=f'csv文件{list_idx+1}') plt.xlabel('数据行索引') plt.ylabel('Powermeter1 Start 数值') plt.title('功率数据随行索引变化对比') plt.legend() # 数据量太多导致图例遮挡时可删除该行 plt.grid(alpha=0.3) plt.show()
场景2:每个csv的数据单独绘制子图
如果需要每个文件的曲线单独展示,可使用子图方案:
# 解决matplotlib中文显示问题,不需要可以删掉这两行 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 子图行列数根据实际csv数量调整,这里假设有8个csv,设为2行4列 row, col = 2, 4 fig, axes = plt.subplots(row, col, figsize=(16, 8), dpi=100) axes = axes.flatten() # 把子图二维数组摊平,方便循环调用 for list_idx, df in enumerate(dfs): ax = axes[list_idx] ax.plot(df.index, df['Powermeter1 Start'], c=f'C{list_idx}') ax.set_title(f'第{list_idx+1}个csv文件数据') ax.set_xlabel('数据行索引') ax.set_ylabel('功率数值') ax.grid(alpha=0.3) # 自动调整子图间距避免标签重叠 plt.tight_layout() plt.show()
小提示:你原代码中使用
skipfooter参数时,pandas默认的C解析引擎不支持该参数,运行时会抛出警告,建议把读取csv的行改为df = pd.read_csv(fpath, skiprows=26, skipfooter=5, engine='python')即可消除警告。
核心逻辑说明
- 用
enumerate()遍历dfs列表,可同时拿到当前数据在列表中的索引和对应的DataFrame对象 df.index直接对应你需要的每条数据的行索引,作为x轴传入绘图函数即可- 如果csv数量过多,可在循环中加入
plt.savefig(f'csv_{list_idx+1}.png')将每个图单独保存到本地,避免同屏展示拥挤。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

