在python中如何在一个图形上绘制多个kdedet

2022-02-27 00:00:00 python matplotlib seaborn

问题描述

我有以下数据

name        val
G.Kittle    4.0
G.Kittle    10.0
D.Hopkins   3.0
L.Fitzgerald    6.0
... ...
C.Kupp  18.0
R.Woods 21.0
N.Harry 7.0
S.Michel    -6.0

每个name都有很多值,我想在同一张图上绘制每个名称的分布。我试着用hue参数来做这件事,但是这把所有的事情都搞砸了,把所有的分布都当作面积为1的,但是,我希望每个分布彼此独立,并且有它们自己的面积1。这有意义吗?我还希望它们都是灰色的,这是hue自然不允许的。

编辑:另外,当我使用hue时,我收到此错误UserWarning: Dataset has 0 variance; skipping density estimate.


解决方案

sns.kdeplot()有一个参数common_norm=,该参数默认为True。在这种情况下,KDE曲线将与值的数量成比例缩放,使总面积和为1。设置common_norm=False将显示所有KDE曲线,使每条曲线的面积分别为1。

注意,还有一个multiple=参数,默认为"layer",但也可以设置为"stack""fill"。在这种情况下,通用规范将是合适的。

所有曲线都可以着色为灰色,提供了一个调色板,作为带有"灰色"的颜色列表。列表的长度应与色调值的数量相同。由于所有色调值都相同,图例看起来会很奇怪。可以使用legend=False隐藏图例。

当一个色调值仅出现在一行时,不会绘制具有一个元素的kdedit,但会显示警告Dataset has 0 variance; skipping density estimate

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

df = pd.DataFrame({'name': np.random.choice([*'ABCD'], 100, p=[0.4, 0.3, 0.2, 0.1]),
                   'val': np.random.rand(100).cumsum()})
df.loc[0, 'name'] = 'E'  # exactly one row with name 'E'
df['name'] = df['name'].astype('category')
sns.kdeplot(data=df, x='val', hue='name', palette=['grey'] * len(df['name'].cat.categories),
            common_norm=False, legend=False)
plt.show()

相关文章