#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 добро пожаловать 😉