2016-04-21 5 views
0

Ich habe einige Daten mit gemischten positiven und negativen Werten, die die Summe der Absolutwerte jeder Variablen = 100% hier einige Beispieldaten sind:Wie zeichnet man 100% gestapelte Balken mit gemischten + ve und -ve Werten in Matplotlib?

Out01 = [79.069,-1.602,5.067,-4.241,-5.433,-4.590] 
Out02 = [50.348,13.944,-15.373,6.554,5.541,8.240] 
Out03 = [-8.053,0.819,-9.741,2.814,22.475,56.098] 
Out04 = [-17.350,33.710,-18.510,-0.842,3.050,26.537] 
Out05 = [-20.169,37.583,-20.785,-2.041,1.728,17.695] 

zog ich sie wie in Microsoft Excel gewünschten wie folge das "100% gestapelte Spalten" Diagramm: I drew them as desired in Microsoft Excel as follows by the "100% stacked columns" chart: Jetzt möchte ich ähnliche Diagramm in Python durch Matplotlib-Bibliothek zeichnen.

Wie kann ich das tun?

+0

[hier] (http://matplotlib.org/examples/pylab_examples/bar_stacked.html) gestapelt bar Beispiel aus matplotlib Galerie. Sollte dir einen guten Startpunkt geben. – Primer

+0

Das Problem in diesem Beispiel, dass es sich nur um positive Daten handelt. Bitte lesen Sie die Beschreibung in der ersten Antwort unten. –

+0

Dies scheint eine doppelte Frage zu sein: http://stackoverflow.com/questions/35979852/stacked-bar-charts-using-python-matplotlib-for-positive-and-negative-values ​​ – elke

Antwort

0

Schließlich bekam ich die Antwort, Als ich the example in matplotlib page gefolgt, den Boden Schlüsselwort enthält, die den Anstieg der einzelnen Probendaten über die vorherige angibt.

p2 = plt.bar(ind, womenMeans, width, color='y', bottom=menMeans, yerr=womenStd) 

Zum Beispiel, wenn wir Männer und Frauen Daten, wie im Beispiel dargestellt werden sollen, beginnt man mit Männern mit Score 20 (in Serie G1), dann Frauen zu zeichnen, beginnen sie den Wert von 25 Plotten mit Boden Wert von 20. Um dies zu erweitern, wenn wir eine andere Kategorie hinzugefügt, sagen Kinder, mit Kerbe 15, dann sollte es mit Boden = 20 + 25 = 45. usw.

mit negativen Werten dargestellt werden wir haben ein Problem, dass sie in die entgegengesetzte Richtung der positiven gewachsen sind. also sollte es mit bottom = 0 beginnen, dann mit maximalem Wert der Summe von positiven oder negativen Werten unabhängig voneinander. Um das mit einem Beispiel zu verstehen, wenn wir eine Reihe wie folgt grafisch darstellen wollen: (20, 25, -15, 30, -10, -5, 17, 3, -28) Die Böden jedes Wertes sollten sein wie folgt (0, 20, 0, 45, -15, -25, 75, 92, -30) Warum?

Für die 20, wir nur initiieren zeichnen, so, kein Boden erforderlich. Für die 25, wir müssen es Für die -15 bis 20 steigen, ist es der erste negativer Wert, also muss es ohne Bodenwert, so dass der Boden = 0 Für die 30, es sollte unterhalb der Achse gezogen werden um 20 + 25 = 45 Für die -10 angehoben werden, sollte es unter dem bisherigen negativen Wert beginnen, die -15 Für die nächsten -5 ist, sollte es beginnen unterhalb -10 + -15 = -25 Und so weiter. ..

def bottoms_matrix(matrix): 
    positives = [] 
    negatives = [] 
    for i, row_mat in enumerate(matrix): 
     tmp_p = [] 
     tmp_n = [] 
     for j, cell in enumerate(row_mat): 
      if cell >0: 
       tmp_p.append(cell) 
       tmp_n.append(0.) 
      else: 
       tmp_p.append(0.) 
       tmp_n.append(cell) 
     positives.append(tmp_p) 
     negatives.append(tmp_n) 

    # get cumulative sums 
    positives = positives[:-1] 
    negatives = negatives[:-1] 
    positives.insert(0, [0.] * len (matrix[0])) 
    negatives.insert(0, [0.] * len(matrix[0])) 
    tmp = swap_matrix(positives) 
    tmp = [list(np.cumsum(t)) for t in tmp] 
    positives = swap_matrix(tmp) 

    tmp = swap_matrix(negatives) 
    tmp = [list(np.cumsum(t)) for t in tmp] 
    negatives = swap_matrix(tmp) 

    final_matrix =[] 
    for i, row_mat in enumerate(matrix): 
     tmp =[] 
     for j, cell in enumerate(row_mat): 
      tmp.append(positives[i][j] if cell > 0 else negatives[i][j]) 
     final_matrix.append(tmp) 
    return final_matrix 

Ein komplettes Beispiel mit Daten und alle Hilfsfunktionen is uploaded on my Git page.

+0

ich für 3 Tage gewartet haben, aber leider hat niemand geantwortet. Allerdings kannte ich die Antwort und legte sie hier zum Wohle anderer. Ich habe es für das Vertrauen von anderen akzeptiert, dass es wirklich gearbeitet hat, obwohl ich keinen Ruf dafür verdient habe. –

+0

Der Link zu Ihrer Git-Seite scheint nicht zu funktionieren. Wäre es möglich, hier ein komplettes Beispiel + eine Grafik hinzuzufügen? – elke

+0

Vielen Dank @elke für Ihre Bemerkung. Ich habe den fehlerhaften Link korrigiert. –