2017-02-27 61 views
1

enter image description here情节与正常曲线直方图和seaborn命名箱

大家好,我想绘制以下类型使用seaborn具有不同的数据集的情节。问题是当使用直方图类型时,即使提供了内核曲线,我也无法命名这些bin(如2-2.5,2.5-3..etc)。条形图不具有绘制图片中正常曲线的功能。该图像似乎是使用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() 

enter image description here

+0

所以我想你问的问题是“如果我已经有堆积的数据在箱子里,我怎么用KDE绘制直方图?”如果你已经有了'正常曲线',这很容易。否则,这条曲线会是什么? – ImportanceOfBeingErnest

+0

其实正常的弯曲并不意味着在这里完美的钟形。根据数据可能会有偏差。 (在这种情况下,它肯定是倾斜的,而不是正常的)。是的,这个问题应该按照你的建议改变,这正是我问的问题。 :) –

回答

0

所以问题当然是你没有原始数据,但数据已经被分类。人们可以反转这种分档,并从一组原始数据开始。然后再次执行直方图并使用默认情况下显示KDE图的sns.distplot

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() 

enter image description here

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

enter image description here

也可以尝试bw=0.1bw=0.25bw=0.35bw=2看到的差异。

+0

谢谢!这是我正在寻找的答案。我认为,对于数据集的大小,可以使用平滑度属性0.5,否则曲线非常不正常,或者我们可以说过度配置? –