2012-03-30 20 views
5

これは、pyconでWesleyのチュートリアルに出席した後、Pandasライブラリで遊んだ最初の試みです。パンダデータフレームに積み重ねられた棒グラフをプロットする

データフレームをちょっと調べた後、データをマッサージしてもらいたいと思ったが、プロットするのに問題があった。私はmatplotlibライブラリで私のnaivenessを指していると思います。

私が持っているものは、以下のデータを持つpandasシリーズオブジェクトです。私はcol 1( 'file')のバープロットとして、縦向きのラベルとしてプロットしたいと思います。ここ

サンプルデータ: http://pastebin.com/y2w0uJPQ

+0

myserie.plot(kind = 'bar') '以上のものが必要ですか? – Avaris

答えて

13

:それは適切に正と負の扱い

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

値は負の値を原点の下に積み重ねて上の正の値を積み重ねます

+0

うわー!私が探していたものを見ています!あなたはどのように垂直を作っていますか? – moldovean

2

最近、私は非常によく似た何かをする機能をプログラムしました。ここでは簡略化したバージョンがあります:

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

私はあなたのアイデアを得るのを助けてくれることを願っています。

私は今度の0.7.3リリースの一部となり、パンダのためのgitリポジトリに積層バープロット機能を実装しました
+0

この関数は正の値しか扱っていないと思います(累積高さを計算するときに正と負の値を分ける必要があります) –

+0

私は負の値が許されないので正の値に注意していました。 –

関連する問題