Стекова лентова диаграма на курса на времето с 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. Документите се основават на поведението по подразбиране в GUI. Подобренията винаги са добре дошли.   -  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