Размер ячейки в Matplotlib (гистограмма)



Я использую matplotlib, чтобы сделать гистограмму.



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



любой, у кого есть какие-либо идеи, очень ценится.



спасибо

755   7  

7 ответов:

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

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

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

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

добавлено в оригинальный ответ

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

import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))

для 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 ячеек

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

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

вот как я это сделал:

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

поэтому первый параметр в основном "инициализирует" бин-я в частности, создание числа, которое находится между диапазоном, который я установил в параметре bins.

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

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

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

таким образом, от 0 до 10 бин получает значение 10, от 11 до 20 бин получает значение 1, от 21 до 30 бин получает значение 40 и т.д.

для гистограммы с целочисленными значениями 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 вызов добавляет галочку для каждого целого числа.

Я знаю, что это старый вопрос, но я не видел, чтобы кто-то просто добавлял размер Бина в качестве аргумента после выделения диапазона. Bin размер = 50 в этом случае.

plt.hist(data2, bins = np.arange(min(data),max(data),50))

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

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

Comments

    Ничего не найдено.