Повторяющаяся настраиваемая цветовая палитра для Seaborn / Python / Matplotlib

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

Я использую Seaborn

Я уверен, что это где-то в сети, но безуспешно искал больше часа

Например, я бы хотел:

«Четверг» - всегда пурпурный, «Пятница» - красный, «Суббота» - зеленый, «Воскресенье» - синий,

Я буду использовать это для множества разных графиков, используя разные критерии - иногда все 4 дня будут включены, иногда нет.

Если вы посмотрите на пример ниже, цвета работают нормально

Пример 1:

%matplotlib inline
import pandas as pd
import seaborn as sns
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-   book/master/ch08/tips.csv", sep=',')
df=df[(df['sex']=='Female')&(df['smoker']=='No')&(df['time']=='Dinner')&(df['size']==2)]

Выглядит следующим образом

Но Пример 2, основанный на фильтрации воскресенья:

%matplotlib inline
import pandas as pd
import seaborn as sns
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-   book/master/ch08/tips.csv", sep=',')
df=df[(df['sex']=='Female')&(df['smoker']=='No')&(df['time']=='Dinner')&(df['size']==2)]
df=df[df['day']!='Sun']

Выглядит как следует

Что ж, обратите внимание, как все цвета сместились

Как мне настроить пользовательскую палитру, которая сопоставляется с основным списком значений (например, понедельник = красный, вторник = зеленый, среда = синий и т. Д.). Динамически было бы здорово, но статический список тоже подойдет

Я знаю, что могу сделать что-то вроде:

pal = dict(Sat="k", Thur="b", Fri="y", Sun="#9b59b6")

x=sns.barplot(x="day",y="tip",data=df, palette=pal)

Это устанавливает палитру, а затем применяет ее к каждой панели, но я больше надеялся, что смогу использовать существующую палитру, что-то вроде

sns.color_palette("Set1", n_colors=30, desat=.5)

Затем выполните итерацию по палитре и назначьте каждому цвету значение (т.е. первое значение - понедельник, второе вторник и т. Д.)

Буду признателен за любую помощь!

Спасибо!

Джефф


person Stumbling Through Data Science    schedule 18.11.2016    source источник


Ответы (1)


Просто сделайте, как вы говорите: «перебирайте палитру и присваивайте каждому цвету значение». Здесь я буду использовать zip, но также будут работать цикл for или понимание списка / словаря.

df = pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
df1 = df[(df['sex']=='Female')&(df['smoker']=='No')&(df['time']=='Dinner')&(df['size']==2)]
df2 = df1[df1['day']!='Sun']

days = df['day'].unique()
pal = dict(zip(days, sns.color_palette("Set1", n_colors=len(days))))

sns.barplot(x="day",y="tip",data=df1, palette=pal)

df1

sns.barplot(x="day",y="tip",data=df2, palette=pal)

df2

person Stop harming Monica    schedule 18.11.2016