построение составных столбцов на кадре данных панд - PullRequest
5 голосов
/ 30 марта 2012

Это моя первая попытка поиграть с библиотекой Pandas после посещения учебника Уэсли на pycon.

Немного покопавшись в кадре с данными, я рад, что смог обработать данные так, как мне хотелось, но у меня возникли проблемы с их построением. Я думаю, это также указывает на мою наивность с библиотекой matplotlib.

У меня есть объект серии Панд со следующими данными. Я хотел бы построить график в виде столбца с col 1 («файл»), так как метки ориентированы вертикально.

sample data here:
http://pastebin.com/y2w0uJPQ 

Ответы [ 2 ]

13 голосов
/ 08 апреля 2012

Я только что реализовал функцию построения столбчатых диаграмм в git-репозитории для панд, будет частью предстоящего выпуска 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

Он правильно обрабатывает положительные и отрицательные значения (суммируя отрицательные значения ниже исходного и положительные значения выше)

2 голосов
/ 02 апреля 2012

Недавно я запрограммировал функцию для выполнения чего-то очень похожего.Здесь у вас есть упрощенная версия:

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

Я надеюсь, что это поможет вам понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...