2013-06-01 6 views
9

Ich frage mich, wie man ein 100% gestapeltes Flächendiagramm in Matplotlib erstellt. Auf der Matplotlib-Seite konnte ich kein Beispiel dafür finden.Erstellen Sie ein 100% gestapeltes Flächendiagramm mit Matplotlib

Jemand kann mir hier zeigen, wie man das erreicht?

+3

Wie wäre es dieses [Beispiel] (http://matplotlib.org/examples/pylab_examples/stackplot_demo.html)? –

+1

Hast du irgendwas probiert? Normalerweise erhalten Sie eine bessere Antwort auf SO, wenn Sie hauptsächlich Code arbeiten. Wie es aussieht, liest sich diese Frage und "bitte tu meine Arbeit für mich". Das Beispiel @LogicalKnight, auf das gezeigt wird, ist ein guter Start und bringt dich zu 95% dorthin. – tacaswell

Antwort

17

Ein einfacher Weg, dies zu erreichen, ist sicher organisiert werden, dass, wie im Beispiel in einem Array für jeden x-Wert, der y-Wert Summe 100.en

Ich gehe davon aus, dass Sie die y-Werte unten, dh

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

um die Spaltensummen sind 100 stellen Sie sicher, können Sie die y Array durch seine Spaltensummen zu teilen, und dann multipliziert mit 100. Dies macht die y-Werte von 0 bis 100 überspannen, so dass die "Einheit" der Y-Achse Prozent. Wenn Sie stattdessen möchten, dass die Werte der Y-Achse das Intervall von 0 bis 1 überspannen, multiplizieren Sie nicht mit 100.

Auch wenn Sie nicht die y-Werte in ein Array wie oben organisiert haben das Prinzip ist das gleiche; die entsprechenden Elemente in jedem Feld, die aus y-Werten bestehen (z. B. y1, y2 usw.) sollten zu 100 (oder 1) summieren.

Der folgende Code ist eine modifizierte Version des example @LogicalKnight in seinem Kommentar verknüpft.

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

Dies ergibt die unten gezeigte Ausgabe.

enter image description here

+0

Vielen Dank für die richtige Hilfe! Ich kämpfe gerade ein bisschen mit MPL 1.2.1 und numpy, um die Daten an erster Stelle zu plotten, und habe keine Zeit gehabt, dieses Problem noch einmal zu betrachten. Daher bin ich sehr glücklich, dieses schöne Stück Code zu bekommen! Prost Thomas –

+0

Ich habe diese Methode versucht, einen Stapel Diagramm mich jetzt nur noch zur Herstellung und eine Ausnahme jedes Mal, wenn ich versuchen geworfen wird stackplot 'Traceback (jüngste Aufforderung zuletzt) ​​zu nennen: File„“, Zeile 1, in ax.stackplot (Drücke) AttributeError: 'AxesSublot'-Objekt hat kein Attribut' Stackplot'' –

+1

@Magic_Matt_Man Welche Versionen von Python und Matplotlib verwenden Sie? – hooy

Verwandte Themen