J'utilise matplotlib pour créer un histogramme.
Existe-t-il un moyen de définir manuellement la taille des bacs par opposition au nombre de bacs?
python
matplotlib
histogram
Sam Creamer
la source
la source
(data.max() - data.min()) / number_of_bins_you_want
. Le+ binwidth
pourrait être changé en juste1
pour en faire un exemple plus facile à comprendre.lw = 5, color = "white"
ou similaire insère des espaces blancs entre les barresPour N bacs, les bords de bac sont spécifiés par une liste de N + 1 valeurs où les N premiers donnent les bords de bac inférieurs et le +1 donne le bord supérieur du dernier bac.
Code:
Notez que linspace produit un tableau de min_edge à max_edge divisé en N + 1 valeurs ou N bins
la source
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 divisezL
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.la source
J'aime que les choses se passent automatiquement et que les bacs retombent sur de «belles» valeurs. Ce qui suit semble très bien fonctionner.
Le résultat a des bacs sur de beaux intervalles de taille de bac.
la source
desired_bin_size=0.05
,min_boundary=0.850
,max_boundary=2.05
le calcul den_bins
seint(23.999999999999993)
qui se traduit par 23 au lieu de 24 et donc un bac trop peu. Un arrondi avant la conversion entière a fonctionné pour moi:n_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
J'utilise des quantiles pour faire des bacs uniformes et ajustés pour échantillonner:
la source
np.arange(0, 1.01, 0.5)
ounp.linspace(0, 1, 21)
. Il n'y a pas d'arêtes, mais je comprends que les boîtes ont une surface égale, mais une largeur différente sur l'axe X?J'ai eu le même problème que OP (je pense!), Mais je ne pouvais pas le faire fonctionner de la manière spécifié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 cependant).
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» fondamentalement le bac - je crée spécifiquement un nombre qui se situe entre la plage que j'ai définie dans le paramètre bins.
Pour le démontrer, 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. Il s'agit du tableau utilisé pour le paramètre poids: [10,1,40,33,6].
Ainsi, le bac 0 à 10 reçoit la valeur 10, le bac 11 à 20 a la valeur 1, le bac 21 à 30 a la valeur 40, etc.
la source
Pour un histogramme avec des valeurs x entières, j'ai fini par utiliser
Le décalage de 0,5 centre les cases sur les valeurs de l'axe des x. L'
plt.xticks
appel ajoute une coche pour chaque entier.la source