2012-03-30 23 views
5

Este es mi primer intento de jugar con la biblioteca Pandas después de asistir al tutorial de Wesley en Pycon.trazado de barras de barras apiladas en un marco de datos de panda

Después de hurgar un poco con el marco de datos, me alegro de haber podido dar masajes a los datos de la manera que quería pero teniendo problemas para trazarlos. Supongo que también apunta a mi ingenuidad con la biblioteca matplotlib.

Lo que tengo es un objeto de la serie panda con los siguientes datos. Me gustaría trazar como una barra de barras con col 1 ('archivo') como las etiquetas orientadas verticalmente.

datos de la muestra aquí: http://pastebin.com/y2w0uJPQ

+0

Supongo que quieres algo más que 'myserie.plot (kind = 'bar')'? – Avaris

Respuesta

13

yo sólo he implementado una función gráfica de barras apiladas en el repositorio git para pandas, será parte de la próxima versión 0.7.3:

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

Maneja adecuadamente positivo y negativo valores (acumulando valores negativos debajo del origen y valores positivos arriba)

+0

¡guau! ¡mira lo que estaba buscando! ¿Cómo se hace la vertical? – moldovean

2

Recientemente me han programado una función para hacer algo muy similar. Aquí tienes una versión simplificada:

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

Espero que te ayude a hacerte una idea.

+0

Creo que esta función solo maneja valores positivos (debe separar los valores positivos y negativos al calcular las alturas acumuladas) –

+0

Tiene razón, solo me preocupaban los valores positivos porque en mi caso no se permitían los negativos. –

Cuestiones relacionadas