Размер бина в Matplotlib (гистограмма) - PullRequest
124 голосов
/ 08 августа 2011

Я использую matplotlib для создания гистограммы.

По сути, мне интересно, есть ли способ установить размер бункеров вручную, а не количество бинов.

Любой с любыми идеями очень ценится.

Спасибо

Ответы [ 7 ]

223 голосов
/ 29 августа 2012

На самом деле, это довольно просто: вместо количества корзин вы можете дать список с границами корзин. Они также могут быть неравномерно распределены:

plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])

Если вы просто хотите, чтобы они были равномерно распределены, вы можете просто использовать диапазон:

plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))

Добавлено к оригинальному ответу

Приведенная выше строка работает для data, заполненных только целыми числами. Как указывает макрокосм , для поплавков вы можете использовать:

import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
13 голосов
/ 13 ноября 2012

Для N ячеек ребра ячеек определяются списком из N + 1 значений, где первые N задают нижние ребра ячеек, а +1 - верхний край последнего ящика.

Код:

from numpy import np; from pylab import *

bin_size = 0.1; min_edge = 0; max_edge = 2.5
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1
bin_list = np.linspace(min_edge, max_edge, Nplus1)

Обратите внимание, что linspace создает массив от min_edge до max_edge, разбитый на N + 1 значений или N бинов

4 голосов
/ 08 августа 2011

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

1 голос
/ 31 мая 2019

Я использую квантили, чтобы сделать урны единообразными и приспособленными к образцу:

bins=df['Generosity'].quantile([0,.05,0.1,0.15,0.20,0.25,0.3,0.35,0.40,0.45,0.5,0.55,0.6,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1]).to_list()

plt.hist(df['Generosity'], bins=bins, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')

enter image description here

1 голос
/ 14 сентября 2018

Мне нравится, когда все происходит автоматически, и ящики попадают в "хорошие" значения. Кажется, что следующее работает очень хорошо.

import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
def compute_histogram_bins(data, desired_bin_size):
    min_val = np.min(data)
    max_val = np.max(data)
    min_boundary = -1.0 * (min_val % desired_bin_size - min_val)
    max_boundary = max_val - max_val % desired_bin_size + desired_bin_size
    n_bins = int((max_boundary - min_boundary) / desired_bin_size) + 1
    bins = np.linspace(min_boundary, max_boundary, n_bins)
    return bins

if __name__ == '__main__':
    data = np.random.random_sample(100) * 123.34 - 67.23
    bins = compute_histogram_bins(data, 10.0)
    print(bins)
    plt.hist(data, bins=bins)
    plt.xlabel('Value')
    plt.ylabel('Counts')
    plt.title('Compute Bins Example')
    plt.grid(True)
    plt.show()

У результата есть ячейки на хороших интервалах размера ячейки.

[-70. -60. -50. -40. -30. -20. -10.   0.  10.  20.  30.  40.  50.  60.]

computed bins histogram

1 голос
/ 12 декабря 2016

У меня была та же проблема, что и у OP (я думаю!), Но я не мог заставить ее работать так, как указано в Lastalda.Я не знаю, правильно ли я интерпретировал вопрос, но я нашел другое решение (хотя, вероятно, это действительно плохой способ сделать это).

Это был способ, которым я это сделал:

plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);

Что создает это:

image showing histogram graph created in matplotlib

Таким образом, первый параметр в основном «инициализирует» корзину - я специально создаю число, которое находится между диапазоном, который я установил в параметре bin.

Чтобы продемонстрировать это, посмотрите на массивв первом параметре ([1,11,21,31,41]) и массив 'bins' во втором параметре ([0,10,20,30,40,50]):

  • Число 1 (из первого массива) находится в диапазоне от 0 до 10 (в массиве «bin»)
  • Число 11 (из первого массива) находится в интервале от 11 до 20 (в «bin»)массив)
  • Число 21 (из первого массива) находится между 21 и 30 (в массиве 'bins') и т. д.

Затем я использую "веса"параметр для определения размера каждого бина.Это массив, используемый для параметра weights: [10,1,40,33,6].

Таким образом, для бина от 0 до 10 задается значение 10, для бина от 11 до 20 - значение1, ячейке от 21 до 30 присваивается значение 40 и т. Д.

0 голосов
/ 11 сентября 2017

Для гистограммы с целочисленными значениями x я в итоге использовал

plt.hist(data, np.arange(min(data)-0.5, max(data)+0.5))
plt.xticks(range(min(data), max(data)))

Смещение 0,5 центрирует ячейки по значениям оси x.Вызов plt.xticks добавляет тик для каждого целого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...