Monday, July 18, 2022

Plotting Curve based on Numpy Histogram

Согласно https://numpy.org/doc/stable/reference/generated/numpy.histogram.html

numpy.histogram(a, bins=10, range=None, normed=None, weights=None, density=None)

===========================

Параметры

===========================

a: array_like

Входные данные. Гистограмма вычисляется по сглаженному массиву.

binsint или последовательность скаляров или str, необязательно

Если bins имеет значение int, оно определяет количество бинов равной ширины в заданном диапазоне (по умолчанию 10). Если интервалы представляют собой последовательность, она определяет монотонно увеличивающийся массив ребер интервалов, включая крайний правый край, что допускает неравномерную ширину интервалов.

Новое в версии 1.11.0.

=============================

Если bins — это строка, она определяет метод, используемый для вычисления оптимальной ширины бина, как определено параметром histogram_bin_edges.Диапазон (с плавающей запятой, с плавающей запятой), необязательный

Нижний и верхний диапазон бункеров. Если не указан, диапазон просто (a.min(), a.max()). Значения вне диапазона игнорируются. Первый элемент диапазона должен быть меньше или равен второму. диапазон также влияет на автоматический расчет бина. В то время как ширина бина вычисляется как оптимальная на основе фактических данных в пределах диапазона, счетчик бина будет заполнять весь диапазон, включая части, не содержащие данных.

normedbool, необязательный

Устарело с версии 1.6.0.

============================

Два примера Пайтон кода для распределения Лапласа и Гаусса

============================

import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import curve_fit

# Затем определите подходящую функцию и некоторый пример набора данных.

# Образец набора данных предназначен только для этого вопроса. 

# Вы должны использовать свой набор данных и определить свою функцию, 

# которую вы хотите установить

loc, scale = 0., 1.

x = np.random.laplace(loc, scale, 1000)

def laplacian(x,amplitude,loc,scale):

         return amplitude*np.exp(-abs(x-loc)/scale)/(2.*scale)


# Подгонка кривой и ее построение

bin_heights, bin_borders = np.histogram(x, bins='auto')

bin_widths = np.diff(bin_borders)

bin_centers = bin_borders[:-1] + bin_widths / 2

popt, _ = curve_fit(laplacian, bin_centers, bin_heights, p0=[1., 0., 1.])

x_interval_for_fit = np.linspace(bin_borders[0], bin_borders[-1], 10000)

plt.bar(bin_centers, bin_heights, width=bin_widths, label='histogram')

plt.plot(x_interval_for_fit,laplacian(x_interval_for_fit,*popt),label='fit',c='red')

plt.legend()

plt.show()






























(.env) boris@boris-All-Series:~/NUMPYHIST$ cat NumpyHistCurve1.py
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# Затем определите подходящую функцию и некоторый пример набора данных.
# Образец набора данных предназначен только для этого вопроса.
# Вы должны использовать свой набор данных и определить свою функцию,
# которую вы хотите установить

def gaussian(x, mean, amplitude, standard_deviation):
    return amplitude * np.exp( - (x - mean)**2 / (2*standard_deviation ** 2))
    
x = np.random.normal(10, 5, size=10000)

# Подгонка кривой и ее построение

bin_heights, bin_borders = np.histogram(x, bins='auto')
bin_widths = np.diff(bin_borders)
bin_centers = bin_borders[:-1] + bin_widths / 2
popt, _ = curve_fit(gaussian, bin_centers, bin_heights, p0=[1., 0., 1.])

x_interval_for_fit = np.linspace(bin_borders[0], bin_borders[-1], 10000)

plt.bar(bin_centers, bin_heights, width=bin_widths, label='histogram')
plt.plot(x_interval_for_fit,gaussian(x_interval_for_fit,*popt),label='fit',c='red')
plt.legend()
plt.show()






























No comments:

Post a Comment