Изменяйте интенсивность цвета столбцов в зависимости от категории "кошачьего участка" морского дна на основе значения оси Y - PullRequest
0 голосов
/ 13 марта 2020

Для одного или сложенного барплота Я могу варьировать интенсивность цвета в зависимости от значения, используя sns.color_palette("Blues", len(df['x'])) (у него есть собственная проблема, что эквивалентные столбцы по-прежнему имеют разные цвета, но это вопрос для потом). Это выглядит так -
enter image description here

Теперь я могу sh сделать то же самое в catplot . Просматривая документацию , похоже, palette должен помочь, поэтому я построил свою палитру как -

palette={'A': sns.color_palette("Blues", 51), 'B': sns.color_palette('Reds', 51), 'C': sns.color_palette('Greens', 51)}

, где A, B, C - это 3 различных категории, где интенсивность цвета должна меняться в зависимости от значения, которое он принимает по оси Y. Я жестко закодировал длину категорий для быстрого решения. Это, однако, не работает, и палитра не генерируется -
Ошибка -

ValueError: Could not generate a palette for <map object at 0x7efc31a60358>

Пример данных для проверки вашего кода -

       index category  value
0    1/22/20    A      30
1    1/23/20    A      20
2    1/24/20    A      20
3    1/25/20    B      5
4    1/26/20    B      10
5    1/27/20    B      15
6    1/28/20    C      2
7    1/29/20    C      5
8    1/30/20    C      7

Код для того же самого -

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame({'index':['1/22/20', '1/23/20', '1/24/20', '1/22/20', '1/23/20', '1/24/20', '1/22/20', '1/23/20', '1/24/20'], 'category': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 'value': [30,20,20,5,10,15,2,5,7]})
p = {'A': sns.color_palette("Blues", 3), 'B': sns.color_palette('Reds', 3), 'C': sns.color_palette('Greens', 3)}
sns.catplot(x='index', y='value', hue='category', data=df, kind='bar', palette=p)
plt.show()

Решения, использующие Matplotlib, тоже подойдут.

EDIT -
Я думаю, что все сводится к правильному определению цветовой палитры. Я думаю, что это то, как вы определяете это -

p = {'A': sns.color_palette("Blues", 3), 'B': sns.color_palette('Reds', 3), 'C': sns.color_palette('Greens', 3)}

Где ключи являются уникальными значениями в category.

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

ValueError: Invalid RGBA argument:......

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

n1 = plt.Normalize(a["A"].values.min(), a["A"].values.max())
n2 = plt.Normalize(b["B"].values.min(), b["B"].values.max())
n3 = plt.Normalize(c["C"].values.min(), c["C"].values.max())

c1 = plt.cm.Blues(n1(a["A"]))
c2 = plt.cm.Reds(n2(b["B"]))
c3 = plt.cm.Greens(n3(c["C"]))

p = {"A": c1, "B" : c2, "C": c3}

где a, b и c - это фреймы данных, которые содержат одну категорию с ее значениями.

Чего мне здесь не хватает?

...