pyplot绘图报错'DataFrame' object has no attribute 'text' 求助
报错原因
核心错误是变量赋值混淆:你代码中把ax赋值为Teste.loc[:,['Q001', 'NU_NOTA_MT']]生成的pandas DataFrame对象,而text()是matplotlib坐标轴(Axes)对象的方法,pandas DataFrame不存在该方法,因此触发'DataFrame' object has no attribute 'text'报错。
修复方案
- 先通过
plt.subplots()实例化真正的matplotlib坐标轴对象,再将绘图、添加文本的操作绑定到该对象上。 - 原来存绘图数据的变量不要命名为
ax,避免和坐标轴对象混淆。 - 可选优化:拼接选项说明时把连接符从
+改为:,显示更符合阅读习惯;如果说明文本较长,建议放在绘图区域外侧,避免遮挡折线。
修正后可运行代码
import matplotlib.pyplot as plt import pandas as pd # --------------- 以下是你的原有数据,实际运行时替换为自有数据源即可 --------------- Teste = pd.DataFrame([ ['A', 'SC', 482.720461], ['B', 'SC', 505.414095], ['H', 'SC', 520.755467], ['C', 'SC', 522.308284], ['D', 'SC', 533.886299], ['E', 'SC', 556.726944], ['F', 'SC', 606.302340], ['G', 'SC', 630.829501] ], columns=['Q001', 'SG_UF_RESIDENCIA', 'NU_NOTA_MT']) q001eq002Dicionario = { 'A': 'Nunca Estudou', 'B': 'Não completou a 4º série/5º ano do ensino fundamental', 'C': 'Completou a 4º série/5º ano, mas não completou a 8º série/9º ano do ensino fundamental', 'D': 'Completou a 8º série/9º ano do ensino fundamental, mas não completou o ensino médio', 'E': 'Completou o ensino médio, mas não completou a Faculdade', 'F': 'Completou a Faculdade, mas não completou a Pós-Graduação', 'G': 'Completou a Pós-Graduação', 'H': 'Não sei' } # ----------------------------------------------------------------------------- # 关键修正:生成matplotlib画布和坐标轴对象 fig, ax = plt.subplots(figsize=(12, 7)) # 提取绘图用数据,单独赋值不占用ax变量名 plot_data = Teste.loc[:, ['Q001', 'NU_NOTA_MT']] # 基于坐标轴对象绘制折线 ax.plot(plot_data['Q001'], plot_data['NU_NOTA_MT'], 'ro-', label='MTM') # 拼接问卷选项说明文本 textdictQ002 = "" for key, value in q001eq002Dicionario.items(): textdictQ002 += f"{key}: {value}\n" # 调用坐标轴对象的text方法添加说明文本,此处放在绘图区右侧避免遮挡 ax.text(1.02, 0.5, textdictQ002, transform=ax.transAxes, fontsize=10, verticalalignment='center', bbox={'boxstyle':'round', 'facecolor':'wheat', 'alpha':0.5}) # 设置图表样式 ax.set_title("Notas x Escolaridade Pai", fontsize=20) ax.set_ylabel("Medias", size=15) ax.set_xlabel("Categorias", size=15) ax.legend() ax.grid() # 调整右侧边距,防止说明文本被截断 plt.subplots_adjust(right=0.6) plt.show()
效果说明
运行代码后会正常生成折线图,问卷选项的说明文本会以圆角小麦色底色的文本框形式显示在图表右侧,不会遮挡折线内容。如果需要把文本放在绘图区域内部,只要把ax.text()的第一个参数从1.02改回0.03,同时去掉plt.subplots_adjust(right=0.6)这行即可。
内容的提问来源于stack exchange,提问作者Humberto Luz Oliveira
相关产品推荐
相关产品推荐

