Histogram yapmak için matplotlib kullanıyorum.
Kutuların boyutunu manuel olarak kutu sayısının aksine ayarlamanın bir yolu var mı?
Histogram yapmak için matplotlib kullanıyorum.
Kutuların boyutunu manuel olarak kutu sayısının aksine ayarlamanın bir yolu var mı?
Yanıtlar:
Aslında, oldukça kolay: çöp kutusu yerine çöp kutusu sınırları ile bir liste verebilirsiniz. Bunlar da eşit olmayan bir şekilde dağıtılabilir:
plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])
Sadece eşit olarak dağıtılmasını istiyorsanız, aralığı kullanabilirsiniz:
plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))
Orijinal yanıta eklendi
Yukarıdaki satır data
sadece tamsayılarla dolu için geçerlidir. Macrocosme belirttiği gibi , şamandıralar için şunları kullanabilirsiniz:
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
. Bu + binwidth
sadece 1
daha kolay anlaşılır bir örnek yapmak için değiştirilebilir .
lw = 5, color = "white"
veya benzeri çubuklar arasında beyaz boşluklar ekler
N bölmeleri için, bölme kenarları, ilk N'nin alt bölme kenarlarını ve +1, son bölmenin üst kenarını verdiği N + 1 değerleri listesiyle belirtilir.
Kod:
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'in N + 1 değerlerine veya N bölmelerine ayrılmış min_edge'den max_edge'ye dizi oluşturduğunu unutmayın
Sanırım en kolay yol, sahip olduğunuz verilerin minimum ve maksimum değerlerini hesaplamak ve sonra hesaplamak olacaktır L = max - min
. Daha sonra L
istenen bölme genişliğine bölün (bin boyutuna göre ne demek istediğinizi varsayalım) ve bu değerin tavanını kutu sayısı olarak kullanın.
İşlerin otomatik olarak gerçekleşmesini ve çöp kutularının "güzel" değerlere düşmesini seviyorum. Aşağıdaki oldukça iyi çalışıyor gibi görünüyor.
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()
Sonuçta güzel çöp kutusu aralıklarında kutular bulunur.
[-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
hesaplanması n_bins
haline int(23.999999999999993)
hangi sonuçları 23 yerine 24 ve bu nedenle bir bin çok az. Tamsayı dönüşümünden önce bir yuvarlama benim için çalıştı:n_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
Numuneleri tek tip ve örneklere uygun kovalar yapmak için kullanıyorum:
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)
veya ile değiştirebilirsiniz np.linspace(0, 1, 21)
. Kenar yok, ancak kutuların eşit alana sahip olduğunu anlıyorum, ancak X ekseninde farklı genişlik?
OP ile aynı sorunu yaşadım (sanırım!), Ancak Lastalda'nın belirlediği şekilde çalışmaya başlayamadım. Soruyu doğru yorumlayıp yorumlamadığımı bilmiyorum, ama başka bir çözüm buldum (muhtemelen bunu yapmanın gerçekten kötü bir yolu).
Bunu yapmanın yolu buydu:
plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);
Hangi bunu oluşturur:
Bu yüzden ilk parametre temelde bin'i 'başlatır' - özellikle bins parametresinde ayarladığım aralık arasında bir sayı oluşturuyorum.
Bunu göstermek için, birinci parametrede diziye ([1,11,21,31,41]) ve ikinci parametrede '[bidonlar' dizisine ([0,10,20,30,40,50]) bakın. :
Sonra her bölmenin boyutunu tanımlamak için 'ağırlıklar' parametresini kullanıyorum. Bu, ağırlıklar parametresi için kullanılan dizidir: [10,1,40,33,6].
Böylece 0 ila 10 bölmesine 10 değeri verilir, 11 ila 20 bölmesine 1 değeri verilir, 21 ila 30 bölmesine 40 değeri verilir.