【问题标题】:Plot a histogram with normal curve and name the bins in seaborn用正态曲线绘制直方图并命名 seaborn 中的 bin
【发布时间】:2017-02-27 13:39:07
【问题描述】:

大家好,我正在尝试使用 seaborn 和不同的数据集绘制以下类型的图。问题是当使用直方图类型时,即使它提供了内核曲线,我也无法命名这些箱(如 2-2.5、2.5-3..等)。条形图没有像图片中那样绘制正态曲线的功能。图片好像是用的SPSS统计包,我知之甚少。

以下是我能得到的最接近的东西(我已附上代码)

df = pd.DataFrame({'cat': ['1-1.5', '1.5-2', '2-2.5','2.5-3','3-3.5','3.5-4','4-4.5','4.5-5'],'val': [0,0,1,7,7,33,17,10]})
ax = sns.barplot(y = 'val', x = 'cat', 
              data = df)
ax.set(xlabel='Categories', ylabel='Frequency')
plt.show()

【问题讨论】:

  • 所以我猜你要问的问题是“如果我已经在 bin 中有累积的数据,如何用 KDE 绘制直方图?”如果您已经有了可用的“正常曲线”,那将很容易。否则,那条曲线会是什么?
  • 实际上正常的曲线并不意味着完美的钟形。它可能会根据数据产生偏差。 (在这种情况下,它肯定是歪斜的而不是正常的)。是的,应该按照您的建议更改问题,这正是我要问的问题。 :)

标签: python matplotlib seaborn


【解决方案1】:

所以问题当然是你没有原始数据,而是已经分箱的数据。可以扭转这种分箱并从一组原始数据开始。然后再次执行直方图并使用sns.distplot,默认情况下,它也会显示 KDE 图。

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

cat = ['1-1.5', '1.5-2', '2-2.5','2.5-3','3-3.5','3.5-4','4-4.5','4.5-5']
val = [0,0,1,7,7,33,17,10]
data = []
for i in range(len(cat)):
    data.extend([1.25+i*0.5]*val[i])
bins = np.arange(1,5.5, 0.5)

ax = sns.distplot(data, bins=bins, hist_kws= dict(edgecolor="k"))
ax.set(xlabel='Categories', ylabel='Frequency')
ax.set_xticks(bins[:-1]+0.25)
ax.set_xticklabels(cat)

plt.show()

使用 KDE 函数的 bw 关键字参数来设置曲线的平滑度。例如。 sns.distplot(data, bins=bins, kde_kws=dict(bw=0.5), hist_kws= dict(edgecolor="k")) 其中bw=0.5 产生

也可以尝试bw=0.1bw=0.25bw=0.35bw=2 来查看差异。

【讨论】:

  • 谢谢!这就是我一直在寻找的答案。我认为,对于数据集的大小,平滑度为 0.5 是可以的,否则曲线非常不正常,或者我们可以说过度拟合?
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 2020-02-20
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多