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

如何在Seaborn relplot生成的FacetGrid中添加红色均值线并将其余线设灰

问题:绘制所有折线为灰色、均值折线为红色的Seaborn折线图

请问能否创建所有折线为灰色、均值折线为红色的Seaborn折线图?我尝试使用relplot实现该需求,但不知道如何将均值与原始数据区分开,且目前似乎没有成功绘制出均值线。

可复现数据生成代码

np.random.seed(1)
n1 = 100
n2 = 10
idx = np.arange(0,n1*2)
x, y, cat, id2 = [], [], [], []

x1 = list(np.random.uniform(-10,10,n2))
for i in idx: 
    x.extend(x1)
    y.extend(list(np.random.normal(loc=0, scale=0.5, size=n2)))
    cat.extend(['A', 'B'][i > n1])
    id2.append(idx[i])

id2 = id2 * n2
id2.sort()
df1 = pd.DataFrame(list(zip(id2, x, y, cat)), 
                  columns =['id2', 'x', 'y', 'cat']
                 )

现有绘图尝试代码

g = sns.relplot(
    data=df1, x='x', y='y', hue='id2',
    col='cat', kind='line',
    palette='Greys',
    facet_kws=dict(sharey=False, 
                   sharex=False
                  ),
    legend=False
)

当前效果预览

效果预览图


解决方案

你已经完成了所有个体灰色折线的绘制,只需要遍历分面对象叠加分组均值线即可,完整可运行代码如下:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 生成数据
np.random.seed(1)
n1 = 100
n2 = 10
idx = np.arange(0,n1*2)
x, y, cat, id2 = [], [], [], []

x1 = list(np.random.uniform(-10,10,n2))
for i in idx: 
    x.extend(x1)
    y.extend(list(np.random.normal(loc=0, scale=0.5, size=n2)))
    cat.extend(['A', 'B'][i > n1])
    id2.append(idx[i])

id2 = id2 * n2
id2.sort()
df1 = pd.DataFrame(list(zip(id2, x, y, cat)), 
                  columns =['id2', 'x', 'y', 'cat']
                 )

# 绘制灰色个体折线
g = sns.relplot(
    data=df1, x='x', y='y', hue='id2',
    col='cat', kind='line',
    palette='Greys',
    facet_kws=dict(sharey=False, 
                   sharex=False
                  ),
    legend=False
)

# 叠加红色均值线
for ax in g.axes.flat:
    # 提取当前分面对应的类别
    current_cat = ax.get_title().split('=')[-1].strip()
    cat_data = df1[df1['cat'] == current_cat]
    # 计算每个x值对应的y均值
    mean_df = cat_data.groupby('x', as_index=False)['y'].mean()
    # 绘制红色均值线,调整线宽突出显示
    sns.lineplot(data=mean_df, x='x', y='y', color='red', linewidth=2, ax=ax)

plt.show()

运行后A、B两个分面都会保留原有灰色的个体折线,同时新增一条红色的全局均值折线,满足需求。


内容的提问来源于stack exchange,提问作者a11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 08:36:04