thisgroup = [] groups = [] for key, value in newdata: newgroups = mk_groups(value) if newgroups isNone: thisgroup.append((key, value)) else: thisgroup.append((key, len(newgroups[-1]))) if groups: groups = [g + n for n, g inzip(newgroups, groups)] else: groups = newgroups return [thisgroup] + groups
mk_groups Функция берет словарь (или что-либо с помощью метода items(), например, collections.OrderedDict) и преобразует его в формат данных, который затем используется для создания диаграммы. По сути, это список вида:
Функция add_line создает вертикальную линию на подзаголовке в указанных положениях (в координатах осей).
label_group_bar Функция берет словарь и создает столбчатую диаграмму на подзаголовке с метками под ней. Результат из примера тогда выглядит следующим образом.
Более простые или усовершенствованные решения и предложения по-прежнему очень ценятся.
Ответ 2
Я некоторое время искал это решение. Я немного изменил его для работы с таблицей данных pandas. Справедливо поделиться.
import pandas as pd import numpy as np from matplotlib import pyplot as plt from itertools import groupby
# Plot the main data. ax.bar(foods, totals) ax.grid(axis='y') ax.yaxis.set_major_locator(mticker.MultipleLocator(5)) ax.tick_params('x', length=0) ax.set_xlim(-0.5, 7.5)
# Add ticks and labels for the shelves. shelf_ax = ax.secondary_xaxis(location=0) shelf_ax.set_xticks([i * 2 + 0.5for i inrange(4)], labels=['Shelf 1', 'Shelf 2'] * 2) shelf_ax.tick_params('x', length=15)
# Add ticks and labels for the rooms. room_ax = ax.secondary_xaxis(location=0) room_ax.set_xticks([1.5, 5.5], labels=['Room A', 'Room B']) room_ax.tick_params('x', length=25)
# Long ticks with no labels to separate the rooms. room_sep_ax = ax.secondary_xaxis(location=0) room_sep_ax.set_xticks([-0.5, 3.5, 7.5], ['', '', '']) room_sep_ax.tick_params('x', length=40)