Seaborn使用catplot绘制柱状图显示数值报FacetGrid无text属性错误怎么办
Seaborn柱状图标注数值AttributeError问题修复
错误原因
sns.catplot()返回的是 FacetGrid 分面网格对象,text()是 matplotlib 坐标轴(Axes)类的专属方法,FacetGrid没有该方法,直接调用p.text()会触发属性不存在的报错。- 原有代码还存在两个额外语法/逻辑错误:
- 变量名不匹配:定义的DataFrame名为
plot_df,循环遍历写的是df.iterrows() - 非法属性调用:
row.total.row.matches是错误写法,且text方法的入参逻辑完全错误,无法匹配柱状图标注的坐标要求
- 变量名不匹配:定义的DataFrame名为
修复方案
单张子图场景下,先从FacetGrid中提取Axes坐标轴对象,再遍历柱子标注数值即可,修正后完整代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt plot_df = pd.DataFrame({"total":[30], "matches":[16],"mismatches":[7]}) p = sns.catplot(data=plot_df, kind="bar") # 提取单张图的Axes对象 ax = p.ax # 遍历所有柱子,在顶部标注数值 for patch in ax.patches: bar_height = patch.get_height() # 标注坐标:x取柱子中心位置,y取柱子顶部略靠上的位置 ax.text( patch.get_x() + patch.get_width() / 2, bar_height, f"{int(bar_height)}", ha="center", va="bottom", color="black" ) plt.show()
如果是生成了多张子图的分面场景,遍历p.axes.flat获取每个子图的Axes对象,再重复上述标注逻辑即可。
内容的提问来源于stack exchange,提问作者TeoK
相关产品推荐
相关产品推荐

