我有一个数据框df
,我用它在同一x轴上生成两个条形图。我不想将这些值显示为条形图,而是想要一条适合条形形状的曲线。 IE。它应该有点像高斯或正态分布拟合,但我想保持 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) 删除黑线和绿/蓝条?
最佳答案
您应该只需要 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)
目前还不清楚您想要什么样的曲线,但请阅读 the docs对于distplot
。 kde=True
添加 KDE 曲线,hist=True
添加条形图,fit=stats.gamma
拟合 Gamma 分布(显示为黑线) .
对于删除负值,曲线将延伸到负值区域,因为它与数据相拟合,而数据可能来自允许负值的分布。如果您正在寻找不同的拟合,请从 scipy.stats 中选择不同的分布(例如,处理严格正值的分布)。
关于python - 使用 python 绘制曲线而不是条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625963/