使用seaborn对象接口绘制重叠密度图,添加到for循环内,每个图例都有自己的颜色/标签

问题描述 投票:0回答:1

使用seaborn python库,我试图在同一个图中制作几个相互重叠的密度图,并且我想对每条线进行着色/标记。使用seaborn对象接口,我可以在for循环中绘制密度图。但我无法为每个密度图添加颜色/标签。

我知道还有其他方法,例如,我首先创建一个包含所有数据和相应标签的数据框,然后将其传递给seabornplot()。但我只是想知道下面的代码(使用seaborn对象接口)是否可以进行一些修改。请指教。

  • 使用 Seaborn 对象进行绘图

代码:

这里我设置 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 plot without individual color for each density

  • 想要的剧情

如果我直接使用seaborn kdeplot,我可以获得所需的图(如下)。但我只是想知道是否可以使用 seaborn 对象而不是直接 kdeplot

使用 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 plot with individual color for each density

python seaborn kdeplot seaborn-objects
1个回答
1
投票

我想这里的技巧是准备你的 df ,这样你就可以放弃循环并使用颜色 kwarg ,因为它意味着要使用

import scipy.stats as st
import seaborn.objects as so
import pandas as pd

num_samples = 2000
normal_distr = st.norm(1,1)

df = pd.concat([
    pd.DataFrame(
        {'sn': str(s_n),
        'values': normal_distr.rvs(s_n)}
        )
    for s_n in range(10,num_samples,400)
])

这看起来像这样:

        sn    values
0       10  0.976926
1       10 -0.501831
2       10  1.748071
3       10  0.968493
4       10  0.593531
...    ...       ...
1605  1610  0.311484
1606  1610  1.332424
1607  1610  1.531519
1608  1610  1.240953
1609  1610 -0.793144

然后一行打印即可完成:

so.Plot(df, x='values').add(so.Line(), so.KDE(common_norm=False), color='sn').show()

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.