Мне нужна метка сгруппированной оси для коробчатых диаграмм, например, немного похожая на эту гистограмму, где ось X является иерархической:

Мне сложно работать с объектами группировки, чтобы извлечь значения для коробчатой диаграммы.
Я нашел этот пример тепловой карты, который ссылается на этот сложенный столбчатый ответ от @Stein, но я не могу заставить его работать для моих коробчатых диаграмм (я знаю, что мне не нужна «сумма» групп, но не могу выяснить, как правильно сгруппировать нужные мне значения). В моих реальных данных размеры групп будут другими, а не такими, как в данных примера. Я не хочу использовать «оттенок» Seaborn в качестве решения, поскольку я хочу, чтобы все коробки были одного цвета.
Это самое близкое, что у меня есть, спасибо:
импортировать numpy как np импортировать seaborn как sns импортировать matplotlib.pyplot как plt из группы импорта itertoolsby защита test_table(): data_table = pd.DataFrame({'Room':['Room A']*24 + ['Room B']*24, 'Полка':(['Полка 1']*12 + ['Полка 2']*12)*2, «Основной продукт»: [»Молоко», «Вода», «Сахар», «Мед», «Пшеница», «Кукуруза»]*8, «Количество»: np.random.randint(1, 20, 48), }) вернуть таблицу_данных Защиту add_line(ax, xpos, ypos): line = plt.Line2D([xpos, xpos], [ypos + .1, ypos], Transform=ax.transAxes, color='black') line.set_clip_on(False) ax.add_line(строка) def label_len(my_index,level): метки = my_index.get_level_values(уровень) вернуть [(k, sum(1 для i в g)) для k,g в groupby(labels)] def label_group_bar_table(ax, df): ypos = -.1 масштаб = 1./df.index.size для уровня в диапазоне(df.index.nlevels)[::-1]: поз = 0 для метки, rpos в label_len(df.index,level): lxpos = (pos + .5 * rpos)*масштаб ax.text(lxpos, ypos, label, ha='center', Transform=ax.transAxes) add_line(ax, pos*scale, ypos) поз += рпос add_line(ax, pos*scale, ypos) ypos -= .1 df = test_table().groupby(['Комната','Полка','Скоба']).sum() рис = plt.figure() рис = plt.figure(figsize = (15, 10)) топор = fig.add_subplot(111) sns.boxplot(x=df.Quantity, y=df.Quantity,data=df) #Ниже 3 строк удалить ярлыки по умолчанию labels = ['' для элемента в ax.get_xticklabels()] ax.set_xticklabels(метки) ax.set_xlabel('') label_group_bar_table (ax, df) fig.subplots_adjust(bottom=.1*df.index.nlevels) plt.show() Что дает:
