2013-06-01 13 views
9

Mi chiedevo come creare un grafico ad area in pila 100% in matplotlib. Alla pagina matplotlib non ho trovato un esempio per questo.Creare un grafico ad area in pila 100% con matplotlib

Qualcuno qui può mostrarmi come ottenerlo?

+3

ne dite di questo [es] (http://matplotlib.org/examples/pylab_examples/stackplot_demo.html)? –

+1

Hai provato qualcosa? Solitamente otterrai una risposta migliore su SO se hai per lo più codice funzionante. Così com'è, questa domanda si legge e "per favore fai il mio lavoro per me". L'esempio @LogicalKnight puntato su è un buon inizio e ottiene il 95% del modo in cui ci sono. – tacaswell

risposta

17

Un modo semplice per raggiungere questo obiettivo è quello di fare in modo che per ogni valore x, i valori y sommano a 100.

io presuppongono che i valori y sono organizzati in una matrice come nell'esempio sotto, IE

y = np.array([[17, 19, 5, 16, 22, 20, 9, 31, 39, 8], 
       [46, 18, 37, 27, 29, 6, 5, 23, 22, 5], 
       [15, 46, 33, 36, 11, 13, 39, 17, 49, 17]]) 

per assicurarsi i totali di colonna sono 100, si deve dividere la matrice y dai suoi somme di colonna, e quindi moltiplicare per 100. Questo rende i valori y spaziano da 0 a 100, rendendo la "unità" dell'asse Y percento. Se preferisci che i valori dell'asse y coprano l'intervallo da 0 a 1, non moltiplicare per 100.

Anche se non hai i valori y organizzati in uno array come sopra , Il principio è lo stesso; gli elementi corrispondenti in ogni matrice costituiti da valori y (ad esempio y1, y2 ecc.) devono essere pari a 100 (o 1).

Il codice riportato di seguito è una versione modificata di example @LogicalKnight collegato nel suo commento.

import numpy as np 
from matplotlib import pyplot as plt 

fnx = lambda : np.random.randint(5, 50, 10) 
y = np.row_stack((fnx(), fnx(), fnx())) 
x = np.arange(10) 

# Make new array consisting of fractions of column-totals, 
# using .astype(float) to avoid integer division 
percent = y/y.sum(axis=0).astype(float) * 100 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.stackplot(x, percent) 
ax.set_title('100 % stacked area chart') 
ax.set_ylabel('Percent (%)') 
ax.margins(0, 0) # Set margins to avoid "whitespace" 

plt.show() 

Fornisce l'output mostrato di seguito.

enter image description here

+0

Grazie mille per l'aiuto corretto! Al momento sto combattendo un po 'con mpl 1.2.1 e numpy per tracciare i dati in primo luogo, e non ho avuto il tempo di guardare ancora questo problema. Quindi, sono davvero felice di avere questo bel pezzo di codice! Saluti Thomas –

+0

Ho provato questo metodo per produrre una pila grafico me solo ora, e un'eccezione viene gettata ogni volta che provo a chiamare stackplot 'Traceback (chiamata più recente scorso): file "", riga 1, in ax.stackplot (pressioni) AttributeError: l'oggetto 'AxesSubplot' non ha attributo 'stackplot'' –

+1

@Magic_Matt_Man Quali versioni di Python e Matplotlib stai usando? – hooy

Problemi correlati