J'utilise matplotlib pour créer un histogramme.
En gros, je me demande s’il existe un moyen de définir manuellement la taille des bacs par opposition au nombre de bacs.
Toute personne ayant des idées est grandement appréciée.
Merci
En fait, c'est très facile: au lieu du nombre de bacs, vous pouvez donner une liste avec les limites des bacs. Ils peuvent aussi être inégalement répartis:
plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])
Si vous voulez juste les distribuer également, vous pouvez simplement utiliser la plage:
plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))
Ajouté à la réponse d'origine
La ligne ci-dessus fonctionne pour data
contenant uniquement des entiers. Comme macrocosme indique, pour les flotteurs, vous pouvez utiliser:
import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
Pour les n cases, les bords de la corbeille sont spécifiés par une liste de N + 1 valeurs, les N premières donnant les bords de la corbeille inférieurs et +1 les bords supérieurs de la dernière corbeille.
Code:
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)
Notez que linspace produit un tableau de min_Edge à max_Edge divisé en N + 1 valeurs ou N bacs.
Je suppose que le moyen le plus simple serait de calculer le minimum et le maximum des données dont vous disposez, puis de calculer L = max - min
. Ensuite, vous divisez L
par la largeur de bac souhaitée (je suppose que c'est ce que vous entendez par taille de bac) et utilisez le plafond de cette valeur comme nombre de bacs.
J'aime que les choses se passent automatiquement et que les bacs tombent sur des valeurs "agréables". Ce qui suit semble fonctionner assez bien.
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 __== '__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()
Le résultat a des cases sur les intervalles de Nice de taille.
[-70. -60. -50. -40. -30. -20. -10. 0. 10. 20. 30. 40. 50. 60.]
J'utilise des quantiles pour créer des bacs uniformes et adaptés à l'échantillon:
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')
J'ai eu le même problème que OP (je pense!), Mais je ne pouvais pas le faire fonctionner de la manière indiquée par Lastalda. Je ne sais pas si j'ai bien interprété la question, mais j'ai trouvé une autre solution (c'est probablement une très mauvaise façon de le faire).
Voici comment je l'ai fait:
plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);
Ce qui crée ceci:
Donc, le premier paramètre "initialise" le bac - je crée spécifiquement un nombre compris entre la plage que j'ai définie dans le paramètre bins.
Pour illustrer cela, regardez le tableau dans le premier paramètre ([1,11,21,31,41]) et le tableau 'bins' dans le deuxième paramètre ([0,10,20,30,40,50]) :
Ensuite, j'utilise le paramètre 'poids' pour définir la taille de chaque bac. C'est le tableau utilisé pour le paramètre de pondération: [10,1,40,33,6].
Ainsi, la valeur 10 est attribuée à la case 0 à 10, la valeur 1 à la case 11 à 20, la valeur 40 à la case 21 à 30, etc.