Seaborn报错:'AxesSubplot'无'axline'属性,如何修改代码?
解决FacetGrid分面中绘制直线的AttributeError问题
错误原因
axline()是Matplotlib 3.3.0版本才引入的API,若你的Matplotlib版本低于该版本,就会出现'AxesSubplot' object has no attribute 'axline'的错误。
解决方案
方案1:升级Matplotlib
执行命令升级到满足版本要求的Matplotlib:
pip install --upgrade matplotlib
升级后原代码可正常运行,但注意你的X轴是X3这类分类变量,(0,0)坐标在当前轴上不可见,建议调整直线的起点或斜率对应的坐标(比如基于数值轴val设置),否则直线会超出当前绘图显示范围。
方案2:兼容低版本的替代写法
如果不想升级,可使用plot()方法模拟无限延伸的直线,通过获取坐标轴极值覆盖整个绘图区域:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt data = pd.DataFrame({'site':['a','a','b','b'], 'val':[0.1,0.2,0.3,0.2], 'X1':['c','d','c','d'],'X3':['e','e','f','f']}) g = sns.FacetGrid(data, row="site", col="X1", margin_titles=True, height=2.5) g.map(plt.scatter, "X3", "val", color="#338844", edgecolor="white", s=50, lw=1) # 替代axline绘制斜率为0.2的直线 for ax in g.axes_dict.values(): # 获取y轴当前范围 y_min, y_max = ax.get_ylim() # 基于斜率计算对应的x范围(分类变量X3会被映射为0、1这类数值索引) x_min = (y_min - 0) / 0.2 x_max = (y_max - 0) / 0.2 # 绘制直线 ax.plot([x_min, x_max], [y_min, y_max], c=".2", ls="--", zorder=0) # 重置y轴范围,避免因直线绘制导致范围偏移 ax.set_ylim(y_min, y_max)
内容的提问来源于stack exchange,提问作者Soon
相关产品推荐
相关产品推荐

