Диаграмма стека во времени с openpyxl

Я хочу создать гистограмму стека с помощью openpyxl. На моем листе Excel каждый столбец представляет собой момент времени с данными разных категорий. Из учебника openpyxl кажется простым создавать гистограммы, если у меня есть каждая точка времени для каждой строки. Но у меня нет свободы переключать строки и столбцы. Есть ли способ создать стековую диаграмму с каждым столбцом для момента времени и каждой категорией этого момента времени, пожалуйста? Ниже приведены некоторые примеры данных:

пример данных

Я хочу создать диаграмму, например:

диаграмма для создания:


person Grace    schedule 04.02.2019    source источник
comment
Я правильно понимаю? вы хотите поменять местами заголовки и категории по отношению к примеру здесь без изменения фактических данных ячейки?   -  person Aaron    schedule 05.02.2019
comment
Да все верно   -  person Grace    schedule 05.02.2019
comment
Я обнаружил, что с openpyxl мне почти всегда приходится просто смотреть исходный код. В частности, я запускаю spyder, чтобы использовать его функцию перехода к определению (Ctrl-G). следить за источником.   -  person Aaron    schedule 05.02.2019
comment
Как говорит Аарон, на самом деле это просто вопрос передачи параметра from_rows=True. Документы были основаны на поведении по умолчанию в графическом интерфейсе. Улучшения всегда приветствуются.   -  person Charlie Clark    schedule 05.02.2019


Ответы (1)


Я изменил пример из здесь чтобы использовать ваш пример. Основное изменение заключается в том, чтобы сообщить методу диаграммы add_data(), что у вас есть строки данных вместо столбцов, используя аргумент ключевого слова: from_rows=True. Единственными другими изменениями являются номера строк и столбцов, чтобы получить правильные ссылки.

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference

wb = Workbook(write_only=True)
ws = wb.create_sheet()

rows = [
    ('Mon/Cat', '2018-08', '2018-09', '2018-10', '2018-11'),
    ('Cat 101', 885, 3378, 0, 2155),
    ('Cat 102', 0, 458, 1255, 0),
    ('Cat 103', 474, 0, 1554, 1655),
    ('Cat 104', 1250, 250, 502, 845),
]


for row in rows:
    ws.append(row)


chart1 = BarChart()
chart1.type = "col"
chart1.style = 10
chart1.grouping = "stacked"
chart1.overlap = 100
chart1.title = "Chart Title"
#chart1.y_axis.title = 'y-axis'
#chart1.x_axis.title = 'x-axis'

data = Reference(ws, min_col=1, min_row=2, max_row=5, max_col=5)
cats = Reference(ws, min_col=2, min_row=1, max_col=5)
chart1.add_data(data, from_rows=True, titles_from_data=True)
chart1.set_categories(cats)
chart1.shape = 4
ws.add_chart(chart1, "A10")

wb.save("bar.xlsx")
person Aaron    schedule 04.02.2019
comment
Настройки графики по умолчанию для меня немного отличаются от изображения, которое вы разместили (контуры, тени, линии сетки и т. Д.). Все это можно изменить, но потребуется много копать, чтобы найти точные необходимые свойства. В прошлом я создал минимальный файл Excel, переименовал его в .zip и открыл внутренний xml, чтобы найти имена свойств для вещей, которые я искал. То, как работает openpyxl, должно позволить вам делать что угодно, но не обязательно будет легко узнать, как это сделать. - person Aaron; 05.02.2019
comment
Я бы сказал, не вините библиотеку, вините спецификацию OOXML! ;-) По крайней мере, поскольку openpyxl следует спецификации, вы обычно можете заставить его делать то, что вы хотите. За исключением случаев, когда это не объяснено, как при объединении диаграмм. - person Charlie Clark; 05.02.2019