Python: гистограмма с диапазоном, но распределение рассчитывается для всего набора - PullRequest
0 голосов
/ 17 сентября 2018

Я использую matplotlib для рисования гистограммы в формате pdf, и мне нужно использовать переменную range из-за появления графика.Достигнув максимума в начале и в конце, вероятность вероятности для этих пиков намного выше, так что остальная часть графика не видна, поэтому мне нужно использовать range для «увеличения».Но когда используется диапазон , плотность вероятности будет учитывать только данные в диапазоне .

. Есть ли способ продолжить использование диапазона , ноПлотность вероятности рассчитывается не только с данными в заданном диапазоне , но и со всеми данными?

Заранее спасибо!

Редактировать: я строю pdf размера пакетовдля набора данных.График имеет пики в нижней области ~ 100 байт и в верхней области ~ 1450 байт.Чтобы показать распределение в середине набора данных, я использую диапазон для масштабирования различных областей, что дает более детальную информацию о распределении.

ax.hist(x=list_of_pkt_sizes,bins=25,density=True,range=[500,1000])

Это пример фрагмента кода, используемого для построения одного из увеличенных изображений.в областях.Как сказано выше, теперь он показывает только распределение для данного диапазона.Я хочу общее распространение.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вот как я бы решил эту проблему. Я создал фальшивый дистрибутив с большим количеством низких и высоких значений, согласно вашей информации

plt.figure()
plt.hist(l1, density=True, bins=25)

enter image description here

Я использую функцию numpy.histogram для получения распределения плотности. Обратите внимание, что я использую пользовательский аргумент bins=: я запрашиваю одну ячейку от 0-500, 25 корзин от 500 до 1000 и 1 ячейку от 1000 до 2000

p,b = np.histogram(l1, density=True, bins=[0]+list(np.linspace(500,1000,25+1))+[2000])

enter image description here

Наконец, я использую функцию bar() в matplotlib для построения результирующей гистограммы, но я просто опускаю первый и последний бин

plt.figure()
plt.bar(x=b[1:-2], height=p[1:-1], width=20, align='edge')

enter image description here

0 голосов
/ 17 сентября 2018

Не самое элегантное решение, но вы легко могли бы нормализовать вручную:

import numpy as np

# Convert list to numpy array for convenience
pkt_arr = np.array(list_of_pkt_sizes)

# Set range variables
min_range, max_range = 500, 1000

# Filter out elements not in range to new array
pkt_arr_in_range = pkt_arr[(pkt_arr > min_range) & (pkt_arr < max_range)]

# Get normalisers - bin size and total number of elements
num_elem_norm = pkt_arr.shape[0]
counts, bins = np.histogram(x=pkt_arr_in_range, bins=25)
bin_width = bins[1] - bins[0]

# Get x coordinates of LHS of bins
xs = bins[:-1]

# Normalise counts (prob density per unit of input)
counts_norm = counts / (num_elem_norm * bin_width)

# Use bar chart
ax.bar(xs, counts_norm, width=bin_width, align='edge')

ОБНОВЛЕНИЕ: @DizietAsahi предлагает лучшее предложение в своем комментарии:

min_range, max_range = 500, 1000
min_all, max_all = min(list_of_pkt_sizes), max(list_of_pkt_sizes)
range_ratio = (max_all - min_all) / (max_range - min_range)
ax.hist(list_of_pkt_sizes, bins=int(round(25 * range_ratio)), density=True)
plt.xlim(min_range, max_range)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...