2012-03-30 16 views
5

Questo è il mio primo tentativo di giocare con la libreria di Pandas dopo aver frequentato il tutorial di Wesley su Pycon.tracciare barattoli impilati su un frame di dati panda

Dopo aver curiosato un po 'con il dataframe sono felice di essere stato in grado di massaggiare i dati nel modo in cui volevo, ma avendo problemi nel tracciarlo. Immagino che punti anche alla mia ingenuità con la libreria matplotlib.

Quello che ho è pandas Series oggetto con i seguenti dati. Mi piacerebbe tracciare un barplot con col 1 ('file') come le etichette orientate verticalmente.

dati di esempio qui: http://pastebin.com/y2w0uJPQ

+0

Presumo che tu voglia qualcosa di più di 'myserie.plot (kind = 'bar')'? – Avaris

risposta

13

Ho appena implementato una funzione di grafico a barre in pila nel repository git per i panda, farà parte della prossima 0.7.3 release:

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

Gestisce correttamente positivo e negativo valori (impilando valori negativi sotto l'origine e valori positivi sopra)

+0

Eeeek !!! guarda cosa stavo cercando! Come si fa la verticale? – moldovean

2

Recentemente ho programmato una funzione di fare qualcosa di molto simile. Ecco una versione semplificata:

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

Spero che ti aiuti a farti un'idea.

+0

Penso che questa funzione gestisca solo valori positivi (è necessario separare i valori positivi e negativi quando si calcolano le altezze cumulative) –

+0

Hai ragione, mi interessava solo i valori positivi perché nel mio caso non erano consentiti quelli negativi. –

Problemi correlati