用每两个直方图数据集绘制两个理论PDF

时间:2018-11-15 15:34:54

标签: python matplotlib

我正在尝试使用以下代码(来自Fitting a histogram with python)将两个直方图与两个PDF曲线拟合:

datos_A = df['KWH/hh (per half hour) ']
datos_B = df['Response KWH/hh (per half hour) ']
(mu_A, sigma_A) = norm.fit(datos_A)
(mu_B, sigma_B) = norm.fit(datos_B)
n, bins, patches = plt.hist([datos_A , datos_B], 16, normed=1)
y_A = mlab.normpdf(bins, mu_A, sigma_A)
y_B = mlab.normpdf(bins, mu_B, sigma_B)
l = plt.plot([bins, bins], [y_A, y_B], 'r--', linewidth=2)
plt.grid(True)
plt.show()

但是,我得到这样的东西:

graph with vertical red lines

我得到了那些垂直线,而不是每个直方图的两条PDF线。我已尝试通过多种方式解决此问题,但仍然无法解决。

调整代码后,我得到了这两行,但是它们不是平滑的曲线。

graph with straight lines

1 个答案:

答案 0 :(得分:1)

这是因为plt.plot逐行绘制每个曲线。根据您的示例,这意味着它会绘制n条垂直线,因为所有线的x坐标均为(bins[i], bins[i])

要解决此问题,请更改行:

l = plt.plot([bins, bins], [y_A, y_B], 'r--', linewidth=2)

至:

l_A = plt.plot(bins, y_A, 'r--', linewidth=2)
l_B = plt.plot(bins, y_B, 'b--', linewidth=2)

OR:

l = plt.plot(bins, np.stack([y_A, y_B]).T, '--', lw=2)

编辑

要获得更平滑的线条,您可以像这样重新采样垃圾箱:

N_resample = 100
bins_resampled = np.linspace(min(bins), max(bins), N_resample)
y_A = mlab.normpdf(bins_resampled, mu_A, sigma_A)
y_B = mlab.normpdf(bins_resampled, mu_B, sigma_B)
l = plt.plot(bins_resampled, np.stack([y_A, y_B]).T, '--', lw=2)