Многоосный график Seaborn, присваивающий разные цвета одному и тому же / общему оттенку категории

#python #pandas #matplotlib #graph #seaborn

#python #панды #matplotlib #График #seaborn

Вопрос:

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

    report_date  shift  999  load_count
0   2019-03-31      1   42       227.0
1   2019-03-31      2   13       141.0
2   2019-03-31      3   79       267.0
3   2019-04-01      1  146       580.0
4   2019-04-01      2  177       627.0
5   2019-04-01      3  127       460.0
6   2019-04-02      1  192       583.0
7   2019-04-02      2  121       626.0
8   2019-04-02      3   98       291.0
9   2019-04-03      1  172       580.0
10  2019-04-03      2   83       372.0
11  2019-04-03      3   78       323.0
12  2019-04-04      1   83       403.0
13  2019-04-04      2   69       340.0
14  2019-04-04      3   86       268.0
15  2019-04-05      1  164       567.0
16  2019-04-05      2  169       593.0
17  2019-04-05      3   48       249.0
18  2019-04-06      1  102       304.0
19  2019-04-06      2   48       246.0
20  2019-04-06      3    4         0.0
  
 dfg = df.set_index(['report_date', 'shift']).sort_index(level=[0,1])

fig, ax = plt.subplots(figsize=(15,6))

ax2  = ax.twinx()

sns.barplot(x=dfg.index.get_level_values('report_date'),
            y=dfg.load_count,
           hue=dfg.index.get_level_values('shift'), ax=ax, alpha=0.7)

sns.lineplot(x=dfg.index.get_level_values('report_date'),
            y=dfg['999'],
           hue=dfg.index.get_level_values('shift'), ax=ax2, marker='o', legend=None)

ax.set_title('My Graph')
plt.show()
  

График

Я даже установил одну и ту же категорию Y, и даже тогда цвета разные. Если я изменю цветовую палитру, цвета по-прежнему будут разными, просто разными оттенками палитры.

ПОЧЕМУ это происходит? Категории являются общими, поэтому они должны вести себя одинаково. Почему это происходит?

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

1. Хотя я воспроизводю ваш текущий результат с помощью пустого аргумента палитры , я не могу воспроизвести: если я изменю цветовую палитру, цвета по-прежнему будут разными, просто разными оттенками палитры. Пожалуйста, покажите эту попытку.

Ответ №1:

Я думаю, это потому sns , что рассматривает линейные графики как разные категории и отображает их как одну и ту же последовательность barplots . Один из способов — указать палитру:

 fig, ax = plt.subplots(figsize=(15,6))

ax2  = ax.twinx()
palette = {1:'red', 2:'blue', 3:'green'}
sns.barplot(x=df['report_date'],
            y=df.load_count,
            hue=df['shift'], ax=ax, alpha=0.7,
            palette=palette)

sns.lineplot(x=df['report_date'],
             y=df['999'],
             hue=df['shift'], ax=ax2, marker='o', legend=None,
             palette=palette)

ax.set_title('My Graph')
plt.show()
  

вывод:

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

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

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

2. И чтобы получить цвета sns по умолчанию: palette=sns.color_palette()[0:3]