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

标签 python matplotlib plot scipy seaborn

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

enter image description here

最佳答案

您应该只需要 sns.distplotkde=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对于distplotkde=True 添加 KDE 曲线,hist=True 添加条形图,fit=stats.gamma 拟合 Gamma 分布(显示为黑线) .

对于删除负值,曲线将延伸到负值区域,因为它与数据相拟合,而数据可能来自允许负值的分布。如果您正在寻找不同的拟合,请从 scipy.stats 中选择不同的分布(例如,处理严格正值的分布)。

关于python - 使用 python 绘制曲线而不是条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625963/

相关文章:

python - 在 matplotlib 中使用轴对象设置事件子图?

r - 如何在ggplot中绘制高于和低于零的值的密度?

重新变换线性模型。 R 案例研究

python - 将文本文件中的第一列数据转换为python中的列表

python - 如何处理来自 binance websocket 的多流数据?

python - 多选 Django 复选框表单验证

java - 使用 JFreechart 调整适合另一个轴的大小

python - 使用 python3.8 和 Ubuntu 20.04 设置 VTK

python - 自定义 matplotlib cmap

Python/Arduino : PySerial, Matplotlib,numpy;树莓派