Год за год matplotlib с легендой

Я пытаюсь имитировать этот график из Excel введите описание изображения здесь в python и matplotlib.

Фрейм данных (by_year) выглядит ниже с помощью мультииндекса EDIT – Измененная таблица, отражающая, что строки различны

Month 1 2 3 4 5 6 7 8 9 10 11 12 Year 2012 8 6 8 9 1 2 8 9 4 3 2 6 2013 5 6 2 9 6 2 8 9 4 3 2 6 2014 7 6 3 9 4 2 8 9 4 3 2 6 # create multiple plots on the page (i'm going to print this rather # than display live ax1 = plt.subplot2grid((3, 2), (0,0), colspan=2) ax2 = plt.subplot2grid((3, 2), (1,0)) # loop through the years (each row) and add to chart for idx, row in by_year.iterrows(): row_values = row.values.astype(int).tolist() ax1.bar(month_list, row_values) ax1.legend(str(idx)) 

Проблема 1 – выполняется без ошибок, однако я получаю только один набор баров. Не понимаю, как это исправить. График выглядит следующим образом: введите описание изображения здесь

EDIT – проблема в строке ax1.bar (month_list …). Она использует одну и ту же начальную точку для каждой строки и, следовательно, бары находятся друг над другом. Решение, приведенное @GWW, вычисляет начальную позицию с использованием idx. я бы назвал bar_start.

Проблема 2 – Я не могу найти нигде, как добавить эту легенду с данными под таблицей. Я могу попытаться создать, просто отображая dataframe (я думаю :)), но у Matplotlib уже есть функциональность?

One Solution collect form web for “Год за год matplotlib с легендой”

Это должно заставить вас начать. Вам все равно придется играть со свойствами таблицы, чтобы они выглядели лучше.

Пример графика

 months = [1,2,3,4,5,6,7,8,9,10,11,12] by_year = [ (2012, (8,6,8,9,1,2,8,9,4,3,2,6)), (2013, (5,6,2,9,6,2,8,9,4,3,2,6)), (2014, (7,6,3,9,4,2,8,9,4,3,2,6)), ] colors = ['r','g','b','y'] import pylab as plt fig, ax = plt.subplots(1,1, figsize=(8, 4)) #0.9 to leave a small space between groups of bars import numpy as NP N = 0.95 / (len(by_year)) cell_text = [] for i, (year, row) in enumerate(by_year): print i, year, row idx = NP.arange(0, len(months)) + N * i # * 0.8 to put a small gap between bars ax.bar(idx, row, color=colors[i], width=N * 0.8, label=year) cell_text.append(row) tbl = ax.table(cellText=cell_text, rowLabels=[x[0] for x in by_year], loc='bottom', colLabels=months) prop = tbl.properties() ax.set_xticks([]) lgd = ax.legend(loc='upper left', bbox_to_anchor=(1, 1.0)) fig.show() 
  • Построение 2D-карты тепла с помощью Matplotlib
  • python matplotlib dash-dot-dot - как?
  • включить файлы изображений в шаблонах Django показывает неработающую ссылку?
  • Как удалить серые граничные линии на карте при построении netcdf с помощью imshow в matplotlib?
  • custom matplotlib plot: шахматная доска, как таблица с цветными ячейками
  • Установка прямой линии на кривую log-log в matplotlib
  • Инвертировать ось в matplotlib grafic
  • Как сделать диаграмму matplotlib / pandas гистограммой?
  • Python - лучший язык программирования в мире.