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

时间:2017-12-04 03:10:02

标签: python matplotlib plot scipy seaborn

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

enter image description here

1 个答案:

答案 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=Truehist=True添加了KDE曲线,fit=stats.gamma添加了条形,scipy.stats符合伽马分布(显示为黑线)。

至于去除负值,曲线将延伸到负区域,因为它适合数据,可能来自允许负值的分布。如果您正在寻找不同的匹配,请从{{1}}中选择不同的分布(例如,处理严格正值的分布)。