Я использую matplotlib для создания гистограммы.
В принципе, мне интересно, есть ли способ вручную установить размер бункеров в отличие от количества ящиков.
Приветствуется любой, кто имеет какие-либо идеи.
Спасибо
Я использую matplotlib для создания гистограммы.
В принципе, мне интересно, есть ли способ вручную установить размер бункеров в отличие от количества ящиков.
Приветствуется любой, кто имеет какие-либо идеи.
Спасибо
На самом деле это довольно просто: вместо количества ящиков вы можете предоставить список с границами бинов. Они также могут быть распределены неравномерно:
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 (я думаю!), но я не мог заставить ее работать так, как указано в Lastalda. Я не знаю, правильно ли я правильно истолковал вопрос, но я нашел другое решение (возможно, это действительно плохой способ сделать это).
Так я и сделал:
plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);
Что создает это:
Итак, первый параметр в основном "инициализирует" бит - я специально создаю число, находящееся между диапазоном I, установленным в параметре bins.
Чтобы продемонстрировать это, посмотрите на массив в первом параметре ([1,11,21,31,41]) и массив "бункеров" во втором параметре ([0,10,20,30,40, 50]):
Затем я использую параметр "вес" для определения размера каждого бункера. Это массив, используемый для параметра веса: [10,1,40,33,6].
Таким образом, в буфере от 0 до 10 задано значение 10, в буфере от 11 до 20 задано значение 1, в ячейке с 21 по 30 задано значение 40 и т.д.
Для гистограммы с целыми значениями х я закончил использование
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
добавляет галочку для каждого целого числа.