我有一个数据df
框,可用于在同一x轴上生成两个条形图。与其将这些值显示为条形图,不如说是一条适合条形的曲线。也就是说,它应该有点像高斯分布或正态分布拟合,但是我想保持x轴和y轴相同,而不显示频率。我还需要从0开始且适合任何负值的拟合。我怎样才能做到这一点?我想象scipycurve_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)删除黑线和绿/蓝条?
您只需要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
添加KDE曲线,hist=True
添加条形图,fit=stats.gamma
拟合伽玛分布(显示为黑线)。
至于消除负值,曲线将延伸到负区域,因为它适合数据,数据可能来自允许负值的分布。scipy.stats
如果要寻找不同的拟合度,请选择一种不同的分布(例如,严格处理正值的分布)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句