2013-05-02 14 views
5

Próbuję wykreślić prosty histogram przy użyciu matplotlib. Mam na przykład (będę w praktyce używać różnych funkcji odległości)Histogramy Matplotlib (podstawowe pytania)

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

Otrzymuję histogram, który wygląda tak.

histogram

Jak zrobić następujące?

  1. Zmiana osi x tak, że ostatni bar zlicza dla x = 10. Jeśli po prostu zmienić bins=np.arange(0,11,1) ten odcina wartość dla x = 10.
  2. Label każdy punkt w X- oś
  3. Przenieś etykiety osi X na środek słupków, a nie na początku tak jak teraz.

Odpowiedz

15

Twoje pierwsze i trzecie punkty można rozwiązać, ustawiając słowo kluczowe wyrównania funkcji histogramu (domyślnie "środek" środkowej części pojemnika). Drugi, ręcznie ustawiając xticks.

Zob

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

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

enter image description here

+0

Kiedy ustawia się N = 10, i za pomocą pojemników = np.arange (0, n + 1,1) etykiety osi X nadal jedynie przejść do 9 . Dlaczego? W końcu ... Wolałbym nie mieć prawdziwych tyknięć, ponieważ są mylące w histogramie. – marshall

+0

Ponieważ 9 jest początkiem ostatniego pojemnika. W swoim poście powiedziałeś, że chcesz wyświetlić tylko początek, wyśrodkowany poniżej paska. W rzeczywistości ten bin ma zakres od 9 do 10. Możesz zbadać wyniki, przechwytując wynik funkcji hist: 'hist, bins, bars = ax.hist()' –

+0

Och dzięki. Tak więc jeden koniec od 9 do 10 nie może być zawarty w koszu. – marshall