【问题标题】:Seaborn data visualization misunderstanding of densities?Seaborn 数据可视化对密度的误解?
【发布时间】:2021-07-05 09:12:28
【问题描述】:

我正在使用 seaborn 库进行数据可视化,并尝试显示标准正态分布。这种情况下的基本情况如下所示:

import numpy as np
import seaborn as sns

n=1000
N= np.random.randn(n)
fig=sns.displot(N,kind="kde")

其行为符合预期。当我尝试同时绘制多个分布时,我的问题就开始了。我尝试了蛮力的N2= np.random.randn(n//2)fig=sns.displot((N,N2),kind="kde"),它返回两个分布(如所希望的那样),但是样本量较小的那个有显着不同(并且更平坦)。无论样本大小如何,适当的密度图(或直方图)都应该使图下方的面积等于 1,但显然不是这样。

知道 seaborn 可以与 pandas Dataframes 一起使用,我尝试使用下面更复杂(通常是糟糕且效率低下,但我希望清楚)的代码再次尝试在同一个图表上进行多个分布:

import numpy as np
import seaborn as sns
import pandas as pd
n=10000

N_1= np.reshape(np.random.randn(n),(n,1))
N_2= np.reshape(np.random.randn(int(n/2)),(int(n/2),1))
N_3= np.reshape(np.random.randn(int(n/4)),(int(n/4),1))

A_1 = np.reshape(np.array(['n1' for _ in range(n)]),(n,1))
A_2 = np.reshape(np.array(['n2' for _ in range(int(n/2))]),(int(n/2),1))
A_3 = np.reshape(np.array(['n3' for _ in range(int(n/4))]),(int(n/4),1))

F_1=np.concatenate((N_1,A_1),1)
F_2=np.concatenate((N_2,A_2),1)
F_3=np.concatenate((N_3,A_3),1)

F= pd.DataFrame(data=np.concatenate((F_1,F_2,F_3),0),columns=["datar","cat"])
F["datar"]=F.datar.astype('float')
fig=sns.displot(F,x="datar",hue="cat",kind="kde")

这再次显示了非常不同(几乎按比例缩放)的分布,证实了这种情况下的结果与我的预期不一致(即大致重叠的分布)。我不明白这个图表是如何工作的吗?有一种完全不同的方法可以在我缺少的同一张图上绘制多个分布?

【问题讨论】:

  • @JohanC 是的,我完全忽略了 kdeplot 的文档。我对默认选项可能不太直观这一事实感到困惑,但我想这是一个选择......谢谢,如果您将此作为答案报告,我会接受它作为正确的选项。跨度>

标签: python numpy random seaborn normal-distribution


【解决方案1】:

无论有无数据框,Seaborn 都能愉快地工作。数据帧的列被转换为 numpy 数组以绘制图表。

sns.displot(..., kind="kde") 指的是sns.kdeplot(),它的参数common_norm 默认为True。将其设置为False 会独立绘制曲线。

import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt

n = 10000

N_1 = np.random.randn(n)
N_2 = np.random.randn(n // 2) + 2
N_3 = np.random.randn(n // 4) + 4

sns.displot((N_1, N_2, N_3), kind="kde", common_norm=False)
plt.show()

请注意,对于kdeplot,默认为True 的选项common_norm 是有意义的,与kdeplot 一样,您还可以创建具有三个独立调用的绘图,这些调用将自动独立。还有一个有用的选项multiple(默认为'layer'),可以设置为'stack''fill'

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多