Для одного или сложенного барплота Я могу варьировать интенсивность цвета в зависимости от значения, используя sns.color_palette("Blues", len(df['x']))
(у него есть собственная проблема, что эквивалентные столбцы по-прежнему имеют разные цвета, но это вопрос для потом). Это выглядит так -
![enter image description here](https://i.stack.imgur.com/qXAQ8.png)
Теперь я могу 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
- это фреймы данных, которые содержат одну категорию с ее значениями.
Чего мне здесь не хватает?