使用seaborn python库,我试图在同一个图中制作几个相互重叠的密度图,并且我想对每条线进行着色/标记。使用seaborn对象接口,我可以在for循环中绘制密度图。但我无法为每个密度图添加颜色/标签。
我知道还有其他方法,例如,我首先创建一个包含所有数据和相应标签的数据框,然后将其传递给seabornplot()。但我只是想知道下面的代码(使用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()
这些图看起来像这样,它不会单独为每条密度线着色/标记。
如果我直接使用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()
(所需的)情节:
我想这里的技巧是准备你的 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()
输出: