我有一个数据帧df
,用于在同一个x轴上生成两个条形图。我不想将这些值显示为条形图,而是想要一条适合条形图的曲线。即它应该像高斯或正态分布拟合,但我想保持x轴和y轴相同,而不是显示频率。我还需要从0开始适合并且对于任何负值。我怎样才能做到这一点?我想scipy curve_fit
函数可能有用或sns.distplot
?
df
size a b
0 0.000000 6.20405
1 0.000000 9.262046
2 2.51524 14.28944
3 6.750392 12.756672
4 9.893210 9.733124
5 10.302983 6.690388
6 11.302383 4.86942
7 8.024279 8.32051
8 4.39434 7.228450
9 2.05516 3.767661
x = df['a']
y = df['b']
n = 10
fig, ax = plt.subplots(1)
bar_width = 0.4 # default: 0.8
bar_locations = np.arange(n)
ax.bar(bar_locations, x, bar_width)
ax.bar(bar_locations - bar_width, y, bar_width, color='r')
fig.show()
更新
fig, ax = plt.subplots()
for a in [x, y]:
sns.distplot(a, bins=range(1, 25, 1), ax=ax, kde=True, fit=stats.gamma)
如何将此图清理为a)强制kde不适用于任何负数(数据从0开始!)和b)删除黑线和绿/蓝条?
答案 0 :(得分:1)
sns.distplot
只需要kde=True
。这将核密度估计器显示为频率曲线。由于尺度不同,您的手动条形图会使曲线模糊不清,因此您应该在辅助y轴上绘制它们,或者在需要时重新缩放它们。
或者sns.kdeplot
仅绘制没有直方图条的KDE曲线。
试试这个:
fig, ax = plt.subplots()
for a in [x, y]:
sns.distplot(
a, bins=range(1, 25, 1), ax=ax,
kde=True, hist=False, fit=None)
不清楚您想要什么样的曲线,但请阅读distplot
kde=True
。 hist=True
添加了KDE曲线,fit=stats.gamma
添加了条形,scipy.stats
符合伽马分布(显示为黑线)。
至于去除负值,曲线将延伸到负区域,因为它适合数据,可能来自允许负值的分布。如果您正在寻找不同的匹配,请从{{1}}中选择不同的分布(例如,处理严格正值的分布)。