Seaborn: создайте гистограмму с градиентными цветами - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть список, содержащий названия различных методов и их производительность в тестовом наборе, которые я хочу показать с помощью гистограммы. Ну, на самом деле я хотел бы нарисовать их относительное улучшение / ухудшение по отношению к базовой модели. Итак, данные выглядят так:

system_1,+2.5
system_2,-0.8
system_3,+0.24

Я пробовал гистограмму в Seaborn, которая дает мне простую гистограмму с фиксированным цветом. Но то, что я ищу, это гистограмма, в которой цвета находятся в диапазоне red, white, green, где красный соответствует data['score'].min(), белый соответствует 0, а зеленый представляет data['score'].max(). Мне бы хотелось, чтобы темнота / яркость цветов показывали их расстояние от 0, а это означает, что темно-красный цвет показывает наихудшую систему, а темно-зеленый цвет показывает наиболее эффективную систему, а все характеристики в середине показаны более светлыми цветами.

Я нашел несколько решений для создания градиентных цветов, но они не делают то, что я ожидаю. Вот мой код и диаграмма, которую я получаю.

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

sns.set(style="whitegrid", color_codes=True)
data = pd.read_csv(sys.argv[1])
pal = sns.color_palette("Greens_d", len(data))
colors = [0 if c >=0 else 1 for c in data['performance']]
ax = sns.barplot(x="performance", y="System", data=data, palette=pal)
plt.tight_layout()
plt.show()

enter image description here

Как видите, вместо создания цветового диапазона в зависимости от значения точки данных, которые он меняет цвета, основаны на индексах точек данных. У вас есть идеи по этому поводу?

Большое спасибо!

1 Ответ

1 голос
/ 11 февраля 2020

Следующий подход использует расходящуюся норму и красно-желто-зеленую цветовую карту, чтобы отобразить наименьшее значение на красный край, ноль на желтый и наивысшее на зеленый.

Поскольку короткие полосы получают очень светлый цвет, добавлен черный край, чтобы сделать каждую полосу отчетливо видимой.

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

sns.set(style='whitegrid', color_codes=True)
N = 11
data = pd.DataFrame({'System': [f'System {i}' for i in range(1, N + 1)],
                     'performance': np.random.uniform(-1.5, 2.5, N)})

norm = DivergingNorm(vmin=data.performance.min(), vcenter=0, vmax=data.performance.max())
colors = [plt.cm.RdYlGn(norm(c)) for c in data['performance']]
ax = sns.barplot(x='performance', y='System', data=data, palette=colors, edgecolor='black')
plt.tight_layout()
plt.show()

resulting plot

банка Сиборна diverging_palette использоваться для создания цветовой палитры с учетом двух значений оттенка. Оттенок 0 - красный, оттенок 150 - зеленый. По умолчанию центр белый. Вы можете экспериментировать с насыщенностью s=80 и легкостью l=55.

red_green_pal = sns.diverging_palette(0, 150, n=256, as_cmap=True)
colors = [red_green_pal(norm(c)) for c in data['performance']]
...