如何修改Seaborn Objects代码,实现带颜色与标签的重叠密度图?
问题描述
我正在使用Python的Seaborn库,希望在同一画布中绘制多张重叠的密度图,并为每条曲线设置独立颜色与标签。目前通过Seaborn Objects接口可在for循环中生成密度图,但无法为每张图添加颜色与标签。我了解可将数据与标签整理为DataFrame后再绘图,但想询问能否通过修改以下现有代码实现需求:
使用Seaborn Objects绘图代码
此处我设置color=s_n(从正态分布中抽取的样本数量),希望以此为每张密度图添加标签(可参考文末的理想效果图)
import scipy.stats as st import seaborn.objects as so num_samples = 2000 normal_distr = st.norm(1,1) sp = so.Plot() for s_n in range(10,num_samples,400): sample_normal = normal_distr.rvs(s_n) sp = sp.add(so.Line(),so.KDE(),x=sample_normal,color=s_n) sp.show()
当前生成的图无法为每条密度曲线单独设置颜色与标签:
理想效果参考
直接使用seaborn kdeplot可实现理想效果,但我希望用Seaborn Objects替代:
使用kdeplot的代码
import scipy.stats as st import seaborn as sns import matplotlib.pyplot as plt num_samples = 2000 normal_distr = st.norm(1,1) for s_n in range(10,num_samples,400): sample_normal = normal_distr.rvs(s_n) sns.kdeplot(x=sample_normal, label=s_n) plt.legend()
理想效果图:
修改方案
以下两种方式可在保留原有循环逻辑或贴合Seaborn Objects设计的前提下,实现每条曲线的独立颜色与标签:
方式一:手动指定颜色并添加标签
直接在add()方法中通过label参数设置图例项,同时从Seaborn调色板中选取对应颜色,适配原循环结构:
import scipy.stats as st import seaborn.objects as so import seaborn as sns num_samples = 2000 normal_distr = st.norm(1,1) # 获取默认调色板颜色列表,避免手动定义颜色 palette = sns.color_palette("tab10") sp = so.Plot() for idx, s_n in enumerate(range(10, num_samples, 400)): sample_normal = normal_distr.rvs(s_n) sp = sp.add( so.Line(color=palette[idx]), # 从调色板取对应颜色 so.KDE(), x=sample_normal, label=str(s_n) # 设置当前曲线的图例标签 ) # 启用图例并显示图形 sp.legend().show()
方式二:基于分组关联颜色与标签
更贴合Seaborn Objects的设计逻辑,将所有数据整理为包含样本量标签的DataFrame,通过group和color参数自动关联颜色与标签:
import scipy.stats as st import seaborn.objects as so import pandas as pd num_samples = 2000 normal_distr = st.norm(1,1) data = [] for s_n in range(10, num_samples, 400): sample_normal = normal_distr.rvs(s_n) # 将每个样本值与对应样本量配对 data.extend([(val, s_n) for val in sample_normal]) # 转换为结构化DataFrame df = pd.DataFrame(data, columns=["value", "sample_size"]) # 绘图时通过color和group参数自动分配颜色与标签 ( so.Plot(df, x="value", color="sample_size") .add(so.Line(), so.KDE(), group="sample_size") .legend(title="Sample Size") # 设置图例标题 .show() )
方案对比
- 方式一:保留原循环结构,无需重构数据,适合快速修改;但颜色需要手动管理,样本量较多时需注意调色板长度。
- 方式二:符合Seaborn Objects的设计理念,自动处理颜色和图例,代码更简洁易维护,推荐用于长期维护的项目。
内容的提问来源于stack exchange,提问作者rkmalaiya
相关产品推荐
相关产品推荐

