2016-08-05 102 views
2

Ich versuche, ein Balkendiagramm in pandas 0.18.1 anzuzeigen, wo die Werte für die verschiedenen Spalten übereinander angezeigt, aber nicht hinzugefügt werden. Also das ist, denke ich, ein gestapeltes Balkendiagramm ohne "stacking", das alle Stapelwerte hinzufügt.Pandas "gestapelt" Balkendiagramm mit Werten nicht hinzugefügt, um Höhe zu geben

So im Beispiel unten

import pandas 
from pandas import DataFrame 

so_example = DataFrame([(15 , 0 , 0 , 4),(16, 0, 1, 4),(17 , 0 , 0 , 6)]).set_index(0) 
so_example.plot.bar(stacked=True) 

Dies gibt die Dataframe

>>> so_example 
    1 2 3 
0   
15 0 0 4 
16 0 1 4 
17 0 0 6 

ich für den zweiten Punkt "16" eine maximale Höhe von 1 + 4 = 5 bekommen. Stattdessen möchte ich die maximale Höhe 4 sein und die "1" in grün wie es jetzt ist.

stacked bar plot

Wie erreiche ich diese künstlich ohne Abzug. Tut mir leid, ich weiß nicht, was diese "gestapelten" Plots heißen, also konnte meine Suche keine einfache Lösung ergeben.

Antwort

2

Bitte überprüfen Sie den folgenden Code, es ist keine umfassende Lösung, aber im Grunde erreichen, was Sie wollen.

import pandas as pd 
import matplotlib.pyplot as plt 

so_example = pd.DataFrame([(15 , 0 , 0 , 4),(16, 0, 1, 4),(17 , 0 , 0 , 6)]).set_index(0) 
fig = plt.figure() 
ax = fig.add_subplot(111) 
_max = so_example.values.max()+1 
ax.set_ylim(0, _max) 
so_example.ix[:,1].plot(kind='bar', alpha=0.8, ax=ax, color='r') 
ax2 = ax.twinx() 
ax2.set_ylim(0, _max) 
so_example.ix[:,2].plot(kind='bar', alpha=0.8, ax=ax2, color='b') 
ax3 = ax.twinx() 
ax3.set_ylim(0, _max) 
so_example.ix[:,3].plot(kind='bar', alpha=0.8, ax=ax3, color='g') 

fig.savefig('c:\haha.png') 
fig.show() 

enter image description here


Hier mein Denken ist:

  1. Zunächst einmal habe ich versucht, das gleiche wie du getan hast, versucht, einige plug and play Lösungen zu finden, aber es scheint, nein
  2. Dann habe ich versucht, mit den Werten zu spielen, aber Sie sagten deutlich, dass Sie nicht tun künstlich mit den Werten spielen wollen. Ich persönlich denke, es hängt wirklich davon ab, wie Sie artifical definieren, ich meine, einige Datenverarbeitung für die Dataframe vor dem Plotten es wäre nicht so schwierig.
  3. Wie auch immer, hier springen wir in die dritte Lösung, die mit dem axis spielen soll. Da grundsätzlich Ihre Anfrage an ist, machen Sie das Balkendiagramm gestapelt, aber mit überlappenden. Ich meine normalerweise stacked bar bedeutet, dass Sie alles ohne Überlappung aufeinander stapeln, deshalb heißt es stack. Aber da Sie die Bar in einer Art und Weise organisieren mögen, dass der kleinste Wert bei der ist ganz vorne, der zweitkleinste Wert ist am 2., so weiter so weiter ...

Also hier, ich benutze twinx(), um verschiedene Achsenlayer für jeden Datensatz zu erstellen, und um die Dinge ein bisschen einfacher für mich zu machen, sortierte ich sie nicht, sondern benutze nur alpha=0.8, um nur die Transparenz zu ändern. und ich habe keine Funktionen für die ganze Sache benutzt. Jedenfalls denke ich, dass dies ein Ansatz ist.