如何在循环绘制的Matplotlib图表中添加另一DataFrame的文本
问题修复方案
核心问题梳理
- 数据框初始化拼写错误:
wshddata应为wshdarea - 未定义
ax变量,导致transform=ax.transAxes报错 - 无需嵌套循环,直接通过
LINE_ID匹配wshdf的ID字段,提取对应面积数据即可 plt.text的坐标与变换方式不匹配:使用transAxes时,坐标是相对坐标轴的比例值(范围0-1),而非实际数据坐标
修正后的完整代码
import pandas as pd import matplotlib.pyplot as plt # 修复数据框初始化的变量名错误 wshdarea = [[1,1840,745],[2,18548,7506],[3,19109,7733]] wshdf = pd.DataFrame(wshdarea, columns=['ID','Acres','Hectares']) stackprofile = pd.DataFrame([[0,1180,1], [5,1181,1], [10,1182,1], [0,1173,2], [5,1174,2], [10,1173,2], [0,1166,3], [5,1166,3], [10,1165,3]], columns=['FIRST_DIST','FIRST_Z','LINE_ID']) ymin = stackprofile['FIRST_Z'].min() ymax = stackprofile['FIRST_Z'].max() groupby = stackprofile.groupby('LINE_ID') lines = list(stackprofile['LINE_ID'].unique()) # 替换为你的实际结果目录路径 resultsdir = "./results" for i in lines: line1 = groupby.get_group(i) x = line1['FIRST_DIST'] y = line1['FIRST_Z'] plt.figure(figsize=(18,14)) # 获取当前轴对象,解决ax未定义问题 ax = plt.gca() plt.scatter(x, y, c="blue", s=10) plt.plot(x,y, c="green") plt.ylim((ymin - .5), ymax) plt.xlabel('距离(FIRST_DIST)') plt.ylabel('高程(FIRST_Z)') # 匹配当前LINE_ID对应的面积数据 wshd_data = wshdf[wshdf['ID'] == i].iloc[0] # 在图表右上角添加面积文本,用transAxes保证位置相对固定 text_content = f"ID: {i}\n面积(英亩): {wshd_data['Acres']}\n面积(公顷): {wshd_data['Hectares']}" plt.text(0.95, 0.95, text_content, horizontalalignment='right', verticalalignment='top', transform=ax.transAxes, fontsize=12, bbox=dict(facecolor='white', alpha=0.8)) plt.savefig(f"{resultsdir}\\profile{str(i)}_test.jpg") plt.close() # 关闭画布释放内存
关键修改说明
- 修正了
wshdf初始化的变量名错误 - 用
plt.gca()获取当前轴对象,解决变换参数报错问题 - 通过ID匹配直接提取对应面积数据,省略不必要的嵌套循环
- 调整文本位置为相对坐标轴的固定区域,添加背景框提升可读性
- 修正坐标轴标签为实际业务含义,增加
plt.close()避免内存占用过高
内容的提问来源于stack exchange,提问作者Kevin Urbanczyk
相关产品推荐
相关产品推荐

