我正在尝试使用以下代码(来自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()
但是,我得到这样的东西:
我得到了那些垂直线,而不是每个直方图的两条PDF线。我已尝试通过多种方式解决此问题,但仍然无法解决。
调整代码后,我得到了这两行,但是它们不是平滑的曲线。
答案 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)