Цветовая палитра Seaborn: как выбрать, какую часть центрировать (например, какой конец графика красный, а какой синий)? - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу подготовить график данных для Pandas, который содержит числовое значение для всех часов года.Он имеет 3 столбца: «Час», «День недели» и «Значение».Я изобразил это так:

cat_weekdayhour = plt.figure(figsize=(12,12))
cat_weekdayhour = sns.set_context("paper")
cat_weekdayhour = sns.set(style="darkgrid", font_scale=.6)

weekdayhour.shape
cat_weekdayhour = sns.catplot(x="Weekday", y="Value", hue="Hour", kind="swarm", palette="coolwarm", data=dataframe)

Это дает мне следующую заговор, но мне не нравится, когда ранние часы дня (например, 0-4 часа утра) очень синие, а затем последние часы(8-11 вечера) красные. Вместо , я хочу центрировать КРАСНЫЙ цвет в ДЕНЬ часов , а затем сделать все ночные часы синим .Можно ли это сделать?Спасибо.

enter image description here

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Создайте свой собственный поддон, сочетая «крутое тепло» с его уважаемой поддоном.У меня есть более старая версия seaborn, поэтому я буду использовать swarmplot для иллюстрации

Пример данных

import seaborn as sns
import numpy as np
import pandas as pd

n = 1000
np.random.seed(123)
df = pd.DataFrame({'Weekday': ['Friday']*n,
                   'Hour': np.random.randint(0,24,n),
                   'Value': np.random.randint(40,150,n)})

coolwarm palette

sns.swarmplot(x="Weekday", y="Value", hue="Hour", palette="coolwarm", data=df)

enter image description here

Пользовательская палитра

# 24 hours so split evenly between the two
mypal = sns.color_palette("coolwarm", 12) + sns.color_palette("coolwarm_r", 12)
sns.swarmplot(x="Weekday", y="Value", hue="Hour", palette=mypal, data=df)

enter image description here

0 голосов
/ 08 декабря 2018

Одной из идей может быть создание новой цветовой карты, назовем ее "cycliccoolwarm", которая содержит исходную цветовую карту и ее обратную версию.Тогда использовать эту новую цветовую карту так же просто, как и любую другую существующую цветовую карту.

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

df = pd.DataFrame({"Day" : np.repeat(np.array(list("1234567")),24*40 ),
                   "Hour" : np.tile(np.arange(0,24), 7*40).astype(int),
                   "Value" : np.random.rand(7*24*40)*180})
df['Hour'] = df['Hour'].apply('{:02d}:00'.format)

cmap_orig = plt.get_cmap("coolwarm")
colors = cmap_orig(np.concatenate((np.linspace(0,1,128), np.linspace(1,0,128))))
cmap = ListedColormap(colors)
plt.cm.register_cmap("cycliccoolwarm", cmap=cmap)

g = sns.catplot(x="Day", y="Value", hue="Hour", kind="swarm", palette="cycliccoolwarm", data=df)

plt.show()

enter image description here

0 голосов
/ 08 декабря 2018

Вы используете столбец Hour в вашем фрейме данных в качестве источника для раскраски.Вместо этого вы можете ввести новый столбец, который содержит значения от часа относительно 12: 00:

dataframe['Color'] = -abs(dataframe['Hour'] - 12)

Таким образом, 12:00 станет 0, 24:00 станет -12.6:00 и 18:00 станут -6.Таким образом, середина дня будет представлена ​​самым высоким значением (красный → 0), а полночь будет представлена ​​самым низким значением (синий → -12).

...