如何为pandas DataFrame的每一行单独绘制带百分比标注的折线图
实现代码(基于Matplotlib)
直接复制运行即可,会自动生成2行5列的子图展示所有折线图,也支持修改为单独导出每张图:
import pandas as pd import matplotlib.pyplot as plt # 先构造你的DataFrame,如果你已经有df变量可以直接跳过这一段 data = { 'mean_1': [3.8, 3.266667, 2.516667, 2.833333, 2.933333, 2.7, 2.7, 2.766667, 4.0, 4.216667], 'mean_2': [3.8, 3.333333, 3.2, 3.366667, 3.516667, 3.416667, 3.233333, 3.316667, 4.083333, 4.9], 'mean_3': [3.898305, 3.491525, 3.338983, 3.661017, 3.610169, 3.677966, 6.593220, 6.610169, 7.322034, 8.067797], 'mean_4': [4.067797, 3.864407, 3.593220, 3.932203, 4.067797, 4.033898, 6.966102, 6.881356, 7.423729, 8.169492], 'Average Percent Change': [7.05, 15.93, 12.29, 16.8, 15.67, 18.07, 115.45, 107.48, 81.81, 66.72] } df = pd.DataFrame(data, index=['Q33','Q35','Q37','Q39','Q41','Q43','Q45','Q47','Q52','Q54']) # 配置X轴标签 x_labels = ['mean_1', 'mean_2', 'mean_3', 'mean_4'] # 子图布局:2行5列,可根据需求调整 fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(20, 8)) # 把axes展平成一维数组方便遍历 axes = axes.flatten() # 遍历每一行数据绘图 for idx, (row_idx, row) in enumerate(df.iterrows()): ax = axes[idx] # 提取Y轴数值 y_vals = [row['mean_1'], row['mean_2'], row['mean_3'], row['mean_4']] # 画折线图,加标记点 ax.plot(x_labels, y_vals, marker='o', color='#2E86AB', linewidth=2) # 设置标题,这里默认用index值,你可以换成自己的匹配表,比如title_dict[row_idx] = '自定义标题' ax.set_title(row_idx, fontsize=12) # 设置Y轴标签 ax.set_ylabel('测量值', fontsize=10) # 标注百分比变化,放在右侧区域 pct = row['Average Percent Change'] ax.text(1.02, 0.5, f'变化率:\n{pct}%', transform=ax.transAxes, bbox=dict(facecolor='white', alpha=0.8, pad=3), va='center') # 调整子图间距,避免标注和标题重叠 plt.tight_layout() # 展示图表,也可以换成plt.savefig('all_line_charts.png', dpi=300, bbox_inches='tight')保存为图片 plt.show() # ---------------如果需要单独导出每张图,用下面的代码替换上面的子图部分即可--------------- # for row_idx, row in df.iterrows(): # fig, ax = plt.subplots(figsize=(6,4)) # y_vals = [row['mean_1'], row['mean_2'], row['mean_3'], row['mean_4']] # ax.plot(x_labels, y_vals, marker='o', color='#2E86AB', linewidth=2) # # 自定义标题可以在这里改 # ax.set_title(row_idx, fontsize=14) # ax.set_ylabel('测量值', fontsize=12) # pct = row['Average Percent Change'] # ax.text(1.02, 0.5, f'变化率:\n{pct}%', transform=ax.transAxes, # bbox=dict(facecolor='white', alpha=0.8, pad=3), va='center') # plt.tight_layout() # # 按index命名保存,也可以自定义文件名 # plt.savefig(f'{row_idx}_line_chart.png', dpi=300, bbox_inches='tight') # plt.close()
功能说明
- 默认采用2行5列的子图布局集中展示所有10张折线图,也提供了单独导出每张图的备选代码段
- 标题默认取行索引值(Q33/Q35等),如果需要自定义标题,提前构造索引和标题的映射字典,将
ax.set_title(row_idx)替换为ax.set_title(自定义字典[row_idx])即可 - 百分比变化值自动标注在每张图右侧空白区,添加白色半透明背景保证不同背景下都清晰可读
- 支持导出为高清本地图片,将
plt.show()替换为对应的保存代码即可
内容的提问来源于stack exchange,提问作者S44
相关产品推荐
相关产品推荐

