2012-03-30 41 views
5

Đây là lần đầu tiên tôi thử chơi với thư viện Pandas sau khi tham dự hướng dẫn của Wesley tại pycon.vẽ các ô xếp chồng lên nhau trên khung hình gấu trúc

Sau khi poking xung quanh một chút với các khung dữ liệu Tôi vui vì tôi đã có thể xoa bóp dữ liệu theo cách tôi muốn nhưng gặp khó khăn trong âm mưu nó. Tôi đoán nó cũng chỉ ra sự ngây thơ của tôi với thư viện matplotlib.

Điều tôi có là đối tượng Dòng gấu trúc với các dữ liệu sau. Tôi muốn âm mưu như là một barplot với col 1 ('file') như các nhãn theo định hướng theo chiều dọc.

dữ liệu mẫu ở đây: http://pastebin.com/y2w0uJPQ

+0

Tôi giả định bạn muốn một cái gì đó lớn hơn 'myserie.plot (kind = 'bar')'? – Avaris

Trả lời

13

Tôi vừa mới thực hiện một chức năng cốt truyện vạch xếp chồng lên nhau trong kho git cho gấu trúc, sẽ là một phần của việc phát hành 0.7.3 sắp tới:

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

Nó đúng cách xử lý tích cực và tiêu cực các giá trị (xếp chồng các giá trị âm dưới gốc và các giá trị dương ở trên)

+0

wow! trông những gì tôi đang tìm kiếm! Làm thế nào để bạn thực hiện theo chiều dọc? – moldovean

2

Gần đây tôi đã được lập trình một chức năng để làm điều gì đó rất giống nhau. Ở đây bạn có một phiên bản đơn giản:

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

Tôi hy vọng nó sẽ giúp bạn có được một ý tưởng.

+0

Tôi nghĩ chức năng này chỉ xử lý các giá trị dương (bạn cần tách các giá trị dương và âm khi tính toán chiều cao tích lũy) –

+0

Bạn nói đúng, tôi chỉ quan tâm đến các giá trị tích cực vì trong trường hợp của tôi không được phép. –

Các vấn đề liên quan