使用python绘制曲线而不是条形图

JAG2024

我有一个数据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)删除黑线和绿/蓝条?

在此处输入图片说明

西蒙·鲍里(Simon Bowly)

您只需要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)

这是不是真的清楚什么样的曲线适合你想要的,但阅读的文档distplotkde=True添加KDE曲线,hist=True添加条形图,fit=stats.gamma拟合伽玛分布(显示为黑线)。

至于消除负值,曲线将延伸到负区域,因为它适合数据,数据可能来自允许负值的分布。scipy.stats如果要寻找不同的拟合度,请选择一种不同的分布(例如,严格处理正值的分布)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章