如何在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
相关产品推荐
相关产品推荐

