如何为Seaborn lmplot多子图添加x=y参考线?
问题:Seaborn lmplot多子图添加x=y参考线仅最后一个子图显示
使用Seaborn的lmplot绘制按Model列分栏的多子图时,希望为每个子图添加x=y参考线,但当前代码仅在最后一个子图显示该线。
原代码如下:
sns.set_theme(style="white") sns.lmplot(data=data, x='Target',y='Predicted', hue="Type",col='Model', height=5,legend=False, palette=dict(Train="g", Test="m")) plt.plot([data.iloc[:,0].min(), data.iloc[:,0].max()], [data.iloc[:,0].min(), data.iloc[:,0].max()], "--", label="Perfect model") plt.legend(loc='upper left') plt.show()
问题原因
plt.plot()默认只会在当前激活的子图(也就是多子图中的最后一个)上绘制线条,不会自动应用到所有子图。
解决方案
需要先捕获lmplot返回的FacetGrid对象,然后遍历其中的所有子图,逐个添加x=y参考线:
修改后的完整代码:
import seaborn as sns import matplotlib.pyplot as plt sns.set_theme(style="white") # 保存lmplot返回的FacetGrid对象,用于操作所有子图 g = sns.lmplot(data=data, x='Target', y='Predicted', hue="Type", col='Model', height=5, legend=False, palette=dict(Train="g", Test="m")) # 获取Target列的极值,用于绘制x=y参考线(直接指定列名更直观) x_bounds = [data['Target'].min(), data['Target'].max()] # 遍历所有子图,逐个添加参考线 for ax in g.axes.flat: ax.plot(x_bounds, x_bounds, "--", label="Perfect model") # 在第一个子图添加图例(也可根据需求调整位置) g.axes[0, 0].legend(loc='upper left') plt.show()
关键说明
g = sns.lmplot(...):保存FacetGrid对象,通过它可以访问所有子图g.axes.flat:将二维的子图数组扁平化,方便遍历- 直接使用
data['Target']获取极值,比iloc[:,0]更安全,避免列顺序变动导致错误
内容的提问来源于stack exchange,提问作者Amir Rastgo
相关产品推荐
相关产品推荐

