You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:31:14