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

如何修改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()

当前生成的图无法为每条密度曲线单独设置颜色与标签:
无独立颜色和标签的KDE图

理想效果参考

直接使用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()

理想效果图:
带独立颜色和标签的KDE图

修改方案

以下两种方式可在保留原有循环逻辑或贴合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:52:38