2012-03-30 14 views
5

Dies ist mein erster Versuch mit der Pandas-Bibliothek zu spielen, nachdem ich Wesley's Tutorial bei pycon besucht habe.Plotten von gestapelten Barplots auf einem Panda-Datenrahmen

Nachdem ich ein wenig mit dem Datenrahmen herumgestöbert habe, bin ich froh, dass ich die Daten so verarbeiten konnte, wie ich es wollte, aber Probleme beim Plotten hatte. Ich denke, es deutet auch auf meine Naivität mit der Matplotlib-Bibliothek hin.

Was ich habe, ist Pandas Series Objekt mit den folgenden Daten. Ich möchte als Barplot mit col 1 ('Datei') als vertikal ausgerichtete Labels plotten.

Beispieldaten hier: http://pastebin.com/y2w0uJPQ

+0

Ich nehme an, Sie wollen etwas mehr als 'myserie.plot (kind = 'bar')'? – Avaris

Antwort

13

Ich habe implementiert nur eine gestapelte Balkendiagramm-Funktion im Git Repository für Pandas, wird ein Teil der kommenden 0.7.3 Version sein:

In [7]: df 
Out[7]: 
      a   b   c 
0 0.425199 0.564161 0.727342 
1 0.174849 0.071170 0.679178 
2 0.224619 0.331846 0.468959 
3 0.654766 0.189413 0.868011 
4 0.617331 0.715088 0.387540 
5 0.444001 0.069016 0.417990 
6 0.203908 0.689652 0.227135 
7 0.382930 0.874078 0.571042 
8 0.658687 0.493955 0.245392 
9 0.758986 0.385871 0.455357 

In [8]: df.plot(kind='barh', stacked=True) 

Stacked Bar Plot

Es behandelt richtig positive und negative Werte (stapelt negative Werte unterhalb des Ursprungs und positive Werte oben)

+0

wow! schaut was ich gesucht habe! Wie machst du die Vertikale? – moldovean

2

Vor kurzem habe ich eine Funktion tun etwas sehr ähnlich programmiert. Hier haben Sie eine vereinfachte Version:

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 
from matplotlib.colors import colorConverter 
import matplotlib.lines as mlines 
import matplotlib 

def _add_legend(axes): 
    'It adds the legend to the plot' 
    box = axes.get_position() 
    axes.set_position([box.x0, box.y0, box.width * 0.9, box.height]) 

    handles, labels = axes.get_legend_handles_labels() 

    # sort by the labels 
    handel_lables = sorted(zip(handles, labels), key=operator.itemgetter(1)) 
    handles, labels = zip(*handel_lables) 

    axes.legend(handles, labels, bbox_to_anchor=(1.05, 1), loc=2, 
       borderaxespad=0., prop={'size':LEGEND_FONT_SIZE}, 
       fancybox=True, numpoints=1) 


def stacked_bars(matrix, fhand, bar_colors=None): 
    'It draws stacked columns' 
    bar_width = 1 
    fig = Figure(figsize=FIGURE_SIZE) 
    canvas = FigureCanvas(fig) 
    axes = fig.add_subplot(111) 
    nrows, ncols = matrix.shape 

    bar_locs = range(0, nrows) 
    cum_heights = numpy.zeros(nrows) 
    for col_index, (col_name, column) in enumerate(matrix.iteritems()): 
     color = bar_colors[col_index] if bar_colors is not None else None 
     values = column.values 
     axes.bar(bar_locs, values, color=color, bottom=cum_heights, 
       width=bar_width, label=col_name) 
     cum_heights += values 
    min_y, max_y = axes.get_ylim() 

    #bar labels 
    axes.set_xticks([l + bar_width * 0.4 for l in bar_locs]) 
    labels = axes.set_xticklabels([str(l) + ' ' for l in matrix.index.values], 
            fontsize=AXIS_LABELS_FONT_SIZE) 
    for label in labels: 
     label.set_rotation('vertical') 

    _add_legend(axes) 

    canvas.print_figure(fhand, format=_get_format_from_fname(fhand.name)) 
fhand.flush() 

Ich hoffe, es hilft Ihnen, eine Idee zu bekommen.

+0

Ich denke, diese Funktion behandelt nur positive Werte (Sie müssen die positiven und negativen Werte trennen, wenn Sie die kumulativen Höhen berechnen) –

+0

Sie haben Recht, ich war nur mit positiven Werten beschäftigt, weil in meinem Fall negative nicht erlaubt waren. –