web-dev-qa-db-fra.com

Taille de la corbeille dans Matplotlib (Histogramme)

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

125
Sam Creamer

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))
225
CodingCat

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.

13
user1048442

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.

4
Il-Bhima

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.]

computed bins histogram

1
pay_it_forward

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')

enter image description here

1

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:

image showing histogram graph created in matplotlib

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]) :

  • Le nombre 1 (du premier tableau) est compris entre 0 et 10 (dans le tableau 'bins')
  • Le nombre 11 (du premier tableau) se situe entre 11 et 20 (dans le tableau 'bins')
  • Le nombre 21 (du premier tableau) se situe entre 21 et 30 (dans le tableau 'bins'), etc.

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.

1
bluguy