Переупорядочить сложенную гистограмму в Python’s seaborn

#python #matplotlib #seaborn

Вопрос:

Я использую seaborn библиотеку Python и histplot функцию для создания многоуровневой диаграммы.

Вот пример того, как выглядят мои данные и график:

 import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


group = np.repeat(['G1', 'G2'], 4)
value = np.array(['1', '2', '3', '4', '1', '2', '3', '4'])
percentage = np.array([20, 10, 40, 30, 50, 25, 20, 5])
stacked = pd.DataFrame({'Group':group, 'Value':value, 'Percentage':percentage})
    
sns.histplot(stacked, x = 'Group', hue = 'Value', weights = 'Percentage', multiple = 'stack', palette = 'colorblind', shrink = 0.75)
plt.legend(labels = stacked['Value'].unique()[::-1], bbox_to_anchor = (1, 1), fontsize = 8)
 

вот как выглядит мой текущий сюжет

Я просто хочу изменить порядок Value так, чтобы синяя часть (1) была внизу, а темно-оранжевая часть (4) сверху. Т. Е. она должна быть упорядочена так же, как в легенде, и цвета должны оставаться одинаковыми (1 = синий, 2 = светло-оранжевый и так далее). Почему-то мне не удается создать это.

Любая помощь будет высоко оценена!

Комментарии:

1. Цель состоит в том, чтобы сложить его снизу вверх в порядке возрастания (по отношению к значению), изменить порядок раскраски или и то, и другое?

2. не уверен, правильно ли я понимаю, но я думаю и то, и другое. ответ от @user1740577 ниже-это в значительной степени то, что я хочу, просто ось y, на мой взгляд, все еще не очень хорошо смотрится на их графике…

3. Вы что-то ищете hue_order ?

Ответ №1:

Вы можете использовать invert_yaxis и установить yticks значение от 0 до 100, как показано ниже:

 axe = sns.histplot(stacked, x = 'Group', hue = 'Value', weights = 'Percentage', multiple = 'stack', palette = 'colorblind', shrink = 0.75)
plt.legend(labels = stacked['Value'].unique()[::-1], bbox_to_anchor = (1, 1), fontsize = 8)
plt.gca().invert_yaxis()
plt.yticks(np.arange(0,100,20), np.arange(100,0,-20))
axe.margins(y=0)
plt.show()
 

Если вы добавите эти строки, вы получите этот вывод:

введите описание изображения здесь

Комментарии:

1. спасибо, выглядит великолепно! Я обычно plt.yticks(np.arange(0, 101, 20), np.arange(100, -1, -20)) добавлял галочку по оси y в 0. Тем не менее, я бы надеялся, что есть более простой способ, чем вручную переворачивать и повторно маркировать ось y…

2. @RamsesII добро пожаловать 😉