2013-05-02 11 views
5

Sto provando a tracciare un semplice istogramma usando matplotlib. Ho ad esempio (in pratica userò diverse funzioni a distanza)Istogrammi Matplotlib (domande di base)

import matplotlib.pyplot as plt 
import numpy as np 
import itertools 


def hamdist(str1, str2): 
    """Count the # of differences between equal length strings str1 and str2""" 
    if (len(str1) != len(str2)): 
     print str1, str2, "Length mismatch bozo!!!!!!" 
    diffs = 0 
    for ch1, ch2 in itertools.izip(str1, str2): 
     if ch1 != ch2: 
      diffs += 1 
    return diffs 

n = 10 
bins=np.arange(0,n+2,1) 
hamdists = [] 
for str1 in itertools.product('01', repeat = n): 
    for str2 in itertools.product('01', repeat = n): 
     hamdists.append(hamdist(str1, str2)) 
plt.hist(hamdists, bins=bins) 
plt.show() 

Ottengo un istogramma simile a questo.

histogram

come faccio a fare il seguente?

  1. Change l'asse x in modo che l'ultima barra conta il numero per x = 10. Se semplicemente cambio di bins=np.arange(0,11,1) questo interrompe il valore di x = 10.
  2. Label ogni punto del x- axis
  3. Sposta le etichette dell'asse x sotto il centro delle barre e non all'inizio come ora.

risposta

15

Il primo e il terzo punto possono essere risolti impostando la parola chiave align della funzione dell'istogramma (che per impostazione predefinita è 'mid', il centro del contenitore). Il secondo con l'impostazione manuale dei xticks.

See:

fig, ax = plt.subplots(1,1) 

ax.hist(hamdists, bins=bins, align='left') 
ax.set_xticks(bins[:-1]) 

enter image description here

+0

Quando ho impostato n = 10 e sull'uso di contenitori = np.arange (0, n + 1,1) le etichette di asse x ancora solo andare fino a 9 . Perché? Infine ... preferirei non avere le zecche reali in quanto sono confuse in un istogramma. – marshall

+0

Perché 9 è l'inizio dell'ultimo cestino. Nel tuo post hai detto che vuoi solo visualizzare l'inizio, centrato sotto la barra. In realtà quel bin ha un range compreso tra 9 e 10. Puoi esplorare i risultati catturando il risultato della funzione hist: 'hist, bin, barre = ax.hist()' –

+0

Oh grazie. Quindi una fine da 9 a 10 non deve essere inclusa nel cestino. – marshall