How to plot many kdeplots on one figure in python(在python中如何在一个图形上绘制多个kdedet)
问题描述
我有以下数据
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()
这篇关于在python中如何在一个图形上绘制多个kdedet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!