Я використовую 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
заповнених цілими числами. Як вказує макрокосм , для поплавків ви можете використовувати:
import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
(data.max() - data.min()) / number_of_bins_you_want
. Це + binwidth
може бути змінено просто, 1
щоб зробити це більш легким для розуміння прикладом.
lw = 5, color = "white"
або подібні вставки білі зазори між брусками
Для 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 bins
Я думаю, найпростішим способом було б обчислити мінімум та максимум даних, які ви маєте, а потім обчислити L = max - min
. Потім ви розділите L
на потрібну ширину відрізка (я припускаю, що це саме ви маєте на увазі під розміром відрізка) і використовуєте стелю цього значення як кількість бункерів.
Мені подобається, що речі відбуваються автоматично, і кошти потрапляють на "приємні" значення. Наступне, здається, працює досить добре.
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.]
desired_bin_size=0.05
, min_boundary=0.850
, max_boundary=2.05
розрахунок n_bins
стає , int(23.999999999999993)
який призводить до 23 замість 24 , і тому один бен занадто мало. Округлення до цілочислового перетворення працювало на мене:n_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
Я використовую квантоли, щоб робити бункери рівномірними та пристосованими для вибірки:
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')
np.arange(0, 1.01, 0.5)
або np.linspace(0, 1, 21)
. Немає ребер, але я розумію, коробки мають рівну площу, але різну ширину по осі X?
У мене було те саме питання, що і в ОП (я думаю!), Але я не міг змусити його працювати так, як вказав Ластальда. Я не знаю, чи правильно я інтерпретував це питання, але я знайшов інше рішення (мабуть, це дуже поганий спосіб зробити це).
Це було так, як я це робив:
plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);
Що створює це:
Отже, перший параметр в основному 'ініціалізує' бін - я спеціально створюю число, яке знаходиться між діапазоном, який я задаю в параметрі bins.
Щоб продемонструвати це, подивіться на масив у першому параметрі ([1,11,21,31,41]) та масив 'bins' у другому параметрі ([0,10,20,30,40,50]) :
Тоді я використовую параметр 'ваги', щоб визначити розмір кожного контейнера. Це масив, який використовується для параметра зважування: [10,1,40,33,6].
Отже, від 0 до 10 бін дається значення 10, 11 - 20 бін - значення 1, 21 - 30 бін - значення 40 і т.д.