#python-3.x #matplotlib #scipy #histogram #curve-fitting
Вопрос:
Итак, вот мой код:
import pandas as pd import scipy.stats as st import matplotlib.pyplot as plt from matplotlib.ticker import AutoMinorLocator from fitter import Fitter, get_common_distributions df = pd.read_csv("project3.csv") bins = [282.33, 594.33, 906.33, 1281.33, 15030.33, 1842.33, 2154.33, 2466.33, 2778.33, 3090.33, 3402.33] #declaring facecolor = '#EAEAEA' color_bars = '#3475D0' txt_color1 = '#252525' txt_color2 = '#004C74' fig, ax = plt.subplots(1, figsize=(16, 6), facecolor=facecolor) ax.set_facecolor(facecolor) n, bins, patches = plt.hist(df.City1, color=color_bars, bins=10) #grid minor_locator = AutoMinorLocator(2) plt.gca().xaxis.set_minor_locator(minor_locator) plt.grid(which='minor', color=facecolor, lw = 0.5) xticks = [(bins[idx 1] value)/2 for idx, value in enumerate(bins[:-1])] xticks_labels = [ "{:.0f}-{:.0f}".format(value, bins[idx 1]) for idx, value in enumerate(bins[:-1])] plt.xticks(xticks, labels=xticks_labels, c=txt_color1, fontsize=13) #beautify ax.tick_params(axis='x', which='both',length=0) plt.yticks([]) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) for idx, value in enumerate(n): if value gt; 0: plt.text(xticks[idx], value 5, int(value), ha='center', fontsize=16, c=txt_color1) plt.title('Histogram of rainfall in City1n', loc = 'right', fontsize = 20, c=txt_color1) plt.xlabel('nCentimeters of rainfall', c=txt_color2, fontsize=14) plt.ylabel('Frequency of occurrence', c=txt_color2, fontsize=14) plt.tight_layout() #plt.savefig('City1_Raw.png', facecolor=facecolor) plt.show() city1 = df['City1'].values f = Fitter(city1, distributions=get_common_distributions()) f.fit() fig = f.plot_pdf(names=None, Nbest=4, lw=1, method='sumsquare_error') plt.show() print(f.get_best(method = 'sumsquare_error'))
Проблема в сюжетах, которые он показывает. Первая гистограмма, которую он генерирует, это
Затем я получаю другой график с наиболее подходящими распределениями, который
Затем оператор вывода
{'chi2': {'df': 10.692966790090342, 'loc': 16.690849400411103, 'scale': 118.71595997157786}} Process finished with exit code 0
У меня есть пара вопросов. Почему chi2, наиболее подходящее распределение, не отображается на графике? Как мне построить эти распределения поверх гистограмм, а не отдельно? Функция hist() в библиотеке fitter может это сделать, но там я не могу управлять ячейками, и поэтому в итоге я получаю около 100 ячеек с некоторыми плоскими данными.
Как мне решить эту проблему? Мне нужно построить кривую наилучшего соответствия на гистограмме, которая выглядит как изображение 1. Могу ли я использовать любой другой модуль/пакет для выполнения работы аналогичным образом? При этом используется подгонка по методу наименьших квадратов, но я тоже в порядке с наименьшей вероятностью или логарифмической вероятностью.
Комментарии:
1.
ax.hist(df.City1, color=color_bars, bins=10)
нетplt.hist
и, вероятноf.plot_pdf(names=None, Nbest=4, lw=1, method='sumsquare_error', ax=ax)
, но из API неясно.plot_dff
, принимает лиax
параметр.2. Chi2-это особый случай гамма-излучения. Я бы сказал, что гамма нанесена поверх chi2, так что вы ее не видите.
Ответ №1:
Простой способ построения объектов друг на друге (с использованием некоторых свойств Fitter
класса)
import scipy.stats as st import matplotlib.pyplot as plt from fitter import Fitter, get_common_distributions from scipy import stats numberofpoints=50000 df = stats.norm.rvs( loc=1090, scale=500, size=numberofpoints) fig, ax = plt.subplots(1, figsize=(16, 6)) n, bins, patches = ax.hist( df, bins=30, density=True) f = Fitter(df, distributions=get_common_distributions()) f.fit() errorlist = sorted( [ [f._fitted_errors[dist], dist] for dist in get_common_distributions() ] )[:4] for err, dist in errorlist: ax.plot( f.x, f.fitted_pdf[dist] ) plt.show()
Используя нормализацию гистограммы, нужно было бы поиграть с масштабированием, чтобы снова обобщить.