web-dev-qa-db-fra.com

python trace un histogramme simple en fonction des données groupées

J'ai des données de comptage (100 d'entre elles), chacune correspond à un bac (0 à 99). J'ai besoin de tracer ces données sous forme d'histogramme. Cependant, l'histogramme compte ces données et ne trace pas correctement car mes données sont déjà regroupées.

import random
import matplotlib.pyplot as plt
x = random.sample(range(1000), 100)
xbins = [0, len(x)]
#plt.hist(x, bins=xbins, color = 'blue') 
#Does not make the histogram correct. It counts the occurances of the individual counts. 

plt.plot(x)
#plot works but I need this in histogram format
plt.show()
26
Curious

Si je comprends bien ce que vous voulez réaliser correctement, alors ce qui suit devrait vous donner ce que vous voulez:

import matplotlib.pyplot as plt
plt.bar(range(0,100), x)
plt.show()

Il n'utilise pas hist(), mais il semble que vous ayez déjà mis vos données dans des bacs, donc ce n'est pas nécessaire.

36
redrah

Le problème vient de vos xbins. Vous avez actuellement

xbins = [0, len(x)]

qui vous donnera la liste [0, 100]. Cela signifie que vous ne verrez qu'un seul bac (et non deux) délimité en dessous de 0 et au-dessus de 100. Je ne suis pas totalement sûr de ce que vous voulez de votre histogramme. Si vous voulez avoir 2 bacs espacés de manière inégale, vous pouvez utiliser

xbins = [0, 100, 1000]

pour afficher tout ce qui est inférieur à 100 dans un bac, et tout le reste dans l'autre bac. Une autre option serait d'utiliser une valeur entière pour obtenir un certain nombre de cases régulièrement espacées. En d'autres termes,

plt.hist(x, bins=50, color='blue')

où bacs est le nombre de bacs souhaités.

Sur une note latérale, chaque fois que je ne me souviens pas comment faire quelque chose avec matplotlib, je vais généralement aller à galerie de vignettes et trouver un exemple qui ressemble plus ou moins à ce que j'essaie d'accomplir. Ces exemples sont tous accompagnés de code source, ils sont donc très utiles. Le documentation pour matplotlib peut également être très pratique.

12
jlund3

Cool merci! Voici ce que je pense que le PO voulait faire:

import random
import matplotlib.pyplot as plt
x=[x/1000 for x in random.sample(range(100000),100)]
xbins=range(0,len(x))
plt.hist(x, bins=xbins, color='blue')
plt.show()
7
Russ

Je suis assez sûr que votre problème vient des poubelles. Ce n'est pas une liste de limites mais plutôt une liste de bords de bacs.

xbins = [0,len(x)]

renvoie dans votre cas une liste contenant [0, 100] Indiquant que vous voulez un bac Edge à 0 et un à 100. Vous obtenez donc un bac de 0 à 100. Ce que vous voulez, c'est:

xbins = [x for x in range(len(x))]

Qui retourne:

[0,1,2,3, ... 99]

Ce qui indique les bords du bac que vous souhaitez.

2
Aaron S

Vous pouvez y parvenir en utilisant également hist de matplotlib, pas besoin de numpy. Vous avez essentiellement déjà créé les bacs en tant que xbins. Dans ce cas, x sera votre poids.

plt.hist(xbins,weights=x)
1
csaladenes

Jetez un œil à l'histogramme exemples dans la documentation de matplotlib. Vous devez utiliser la fonction hist . Si par défaut, il ne donne pas le résultat escompté, alors jouez avec les arguments de hist et préparez/transformez/modifiez vos données avant de les fournir à hist. Je ne sais pas vraiment ce que vous voulez réaliser, je ne peux donc pas vous aider à ce stade.

0
Jan-Philip Gehrcke