2010-02-09 5 views
40

Ich würde gerne in der Lage sein, ein gestapeltes Liniendiagramm (ähnlich der Methode here) mit Python (vorzugsweise mit Matplotlib, aber eine andere Bibliothek wäre auch in Ordnung) zu produzieren. Wie kann ich das machen?Wie kann ich mit matplotlib gestapelte Liniendiagramme erstellen?

Diese ähnelt der stacked bar graph example auf ihrer Website, außer ich möchte die Spitze der Bar mit einem Liniensegment verbunden sein und den Bereich darunter zu füllen. Ich könnte das annähern, indem ich die Lücken zwischen den Balken verkleinere und viele Balken benutze (aber das ist wie ein Hack und außerdem bin ich mir nicht sicher, ob das möglich ist).

+5

Der Link in dem Beispiel (http://www.whitehouse.gov/omb/budget/fy2003/images/bud20c.jpg) ist gebrochen. Hast du eine bessere Verbindung? –

+0

Verwenden Sie Stackplot() aus Pyplot-Paket. – AjayKumarBasuthkar

+0

Dies ist eine alte Frage, aber für andere Leute, die diese Frage in einer Suche wie ich finden, gibt es eine neue Lösung, wenn Sie Pandas Datenrahmen verwenden: 'df = pd.DataFrame (np.random.rand (10, 4), Spalten = ['a', 'b', 'c', 'd']) ' ' df.plot.area(); 'von http://pandas.pydata.org/pandas-docs/stable /visualization.html –

Antwort

46

Ich glaube Gebiet Grundstück ein gebräuchlicher Begriff für diese Art von Handlung ist, und in dem speziellen Fall im OP rezitiert, Stacked Gebiet Grundstück.

Matplotlib nicht über eine „out-of-the-box“ -Funktion, die sowohl die Datenverarbeitung und Zeichnen/Rendering Schritte kombiniert eine diese Art von Handlung zu schaffen, aber es ist einfach, Ihre eigenen von Komponenten geliefert zu rollen von Matplotlib und NumPy.

Der Code unter der ersten Stapel die Daten aus, dann zieht die Handlung.

import numpy as NP 
from matplotlib import pyplot as PLT 

# just create some random data 
fnx = lambda : NP.random.randint(3, 10, 10) 
y = NP.row_stack((fnx(), fnx(), fnx())) 
# this call to 'cumsum' (cumulative sum), passing in your y data, 
# is necessary to avoid having to manually order the datasets 
x = NP.arange(10) 
y_stack = NP.cumsum(y, axis=0) # a 3x10 array 

fig = PLT.figure() 
ax1 = fig.add_subplot(111) 

ax1.fill_between(x, 0, y_stack[0,:], facecolor="#CC6666", alpha=.7) 
ax1.fill_between(x, y_stack[0,:], y_stack[1,:], facecolor="#1DACD6", alpha=.7) 
ax1.fill_between(x, y_stack[1,:], y_stack[2,:], facecolor="#6E5160") 

PLT.show() 

example of stacked area plot

+13

Da Sie versuchen, sehr vollständig zu sein, warum nicht in 'Stackplot (x, yn, colorlist)' verwandeln und einen Feature Request Bug upstream einreichen? –

+0

Wenn Sie eine Legende für diese Art von Grafik erstellen möchten, denke ich, dass Sie Proxy "Artists" verwenden müssen http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist –

+1

@honk Es gibt bereits eine [ausstehende PR] (https://github.com/matplotlib/matplotlib/pull/819) (die bald zusammengeführt werden sollte) für eine "Stackplot" -Funktion. –

7

Ein etwas weniger hackischer Weg wäre die Verwendung eines Liniendiagramms an erster Stelle und matplotlib.pyplot.fill_between. Um das Stapeln nachzuahmen, müssen Sie die Punkte selbst verschieben.

x = np.arange(0,4) 
y1 = np.array([1,2,4,3]) 
y2 = np.array([5,2,1,3]) 
# y2 should go on top, so shift them up 
y2s = y1+y2 

plot(x,y1) 
plot(x,y2s) 
fill_between(x,y1,0,color='blue') 
fill_between(x,y1,y2s,color='red') 
+0

Können Sie bitte die Parameter der fill_between() Methode erklären? Es scheint, als ob wir etwas Farbe zwischen x und y füllen, aber was ist die dritte Variable? – khan

+0

@ khan: http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.fill_between –

48

Neuere Versionen von matplotlib enthalten die Funktion plt.stackplot, die für mehrere verschiedene "out-of-the-box" gestapelt Bereich Plots erlauben:

import numpy as np 
import pylab as plt 

X = np.arange(0, 10, 1) 
Y = X + 5 * np.random.random((5, X.size)) 

baseline = ["zero", "sym", "wiggle", "weighted_wiggle"] 
for n, v in enumerate(baseline): 
    plt.subplot(2 ,2, n + 1) 
    plt.stackplot(X, *Y, baseline=v) 
    plt.title(v) 
    plt.axis('tight') 
plt.show() 

Stack Plot using plt.stackplot.

+0

Was "* Y" bedeutet? –

2

Wenn Sie einen Datenrahmen haben, ist es qui te einfach:

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) 
df.plot.area(); 

enter image description here

Von: pandas documentation

Verwandte Themen