Я использую код, отправленный Луисом в качестве ответа на этот вопрос ( Подгонка лучшего гауссиана к точкам данных? ), и мне удалось его запустить и подогнать гауссову кривую к данным примера. Но когда я пытаюсь сделать то же самое с моими данными (пытаясь уместить гистограмму), я никогда не получаю кривую - только гистограмму. Спасибо за помощь в поиске проблемы / ошибки.
data.csv можно скачать здесь https://ufile.io/qg2nmkpe
from scipy.optimize import curve_fit
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
my_data = pd.read_csv("data.csv")
my_data = my_data['data'].tolist()
if (True): #True for example data, False for my dataset
angles = [-8, -6, -4, -2, 0, 2, 4, 6, 8]
data = [99, 610, 1271, 1804, 1823, 1346, 635, 125, 24]
plt.plot(angles, data, "ob", label="Measured")
else:
data, bins, _ = plt.hist(my_data, bins=60, alpha=0.5)
angles = [0.5 * (bins[r] + bins[r + 1]) for r in range(len(bins) - 1)] # center points of bins
data = list(data) # heights of bins
xlims = [min(angles), max(angles)]
angles = np.array(angles)
data = np.array(data)
n = len(data) ## <---
mean = sum(data * angles) / n
sigma = np.sqrt(sum(data * (angles - mean) ** 2) / n)
def gaus(x, a, mu, sigma):
return a * np.exp(-(x - mu) ** 2 / (2 * sigma ** 2))
popt, pcov = curve_fit(gaus, angles, data) # ,p0=[0.18,mean,sigma]) ## <--- leave out the first estimation of the parameters
x = np.linspace(xlims[0], xlims[1], 60) ## <--- calculate against a continuous variable
plt.plot(x, gaus(x, *popt), 'g', label='Fit') ## <--- plot against the contious variable
plt.xlim(xlims[0], xlims[1])
plt.ylim(0, max(data) * 1.1)
plt.savefig('normal.png')
plt.show()
Ожидаемый результат - гистограмма моих данных с гауссовой кривой