Python 改变seaborn'的每种类别的色条的颜色强度;猫图';基于杆的y轴值

Python 改变seaborn'的每种类别的色条的颜色强度;猫图';基于杆的y轴值,python,pandas,matplotlib,seaborn,catplot,Python,Pandas,Matplotlib,Seaborn,Catplot,对于单个条形图或堆叠条形图,我可以使用sns.color_调色板(“Blues”,len(df['x'])(它有自己的问题,即等效条形图仍然有不同的颜色,但这是后面的问题)。看起来是这样的- 现在,我希望在catplot中也这样做。通过查看它看起来像调色板应该有帮助,所以我构建了我的调色板- palette={'A': sns.color_palette("Blues", 51), 'B': sns.color_palette('Reds', 51), 'C': sns.c

对于单个条形图或堆叠条形图,我可以使用
sns.color_调色板(“Blues”,len(df['x'])
(它有自己的问题,即等效条形图仍然有不同的颜色,但这是后面的问题)。看起来是这样的-

现在,我希望在catplot中也这样做。通过查看它看起来像
调色板
应该有帮助,所以我构建了我的调色板-

palette={'A': sns.color_palette("Blues", 51), 'B': sns.color_palette('Reds', 51), 'C': sns.color_palette('Greens', 51)}
其中,
A
B
C
是三种不同的类别,其中颜色强度应根据y轴上的值进行更改。为了快速解决问题,我硬编码了类别的长度。 但是,这不起作用,并且未生成调色板-
错误-

ValueError: Could not generate a palette for <map object at 0x7efc31a60358>
代码相同-

将熊猫作为pd导入
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
数据帧({'index':['1/22/20','1/23/20','1/24/20','1/22/20','1/23/20','1/24/20','1/23/20','1/24/20'],'category':['A','A','B','B','C','C'],'value':[30,20,20,5,10,15,2,5,7]})
p={'A':sns.调色板(“蓝色”,3),'B':sns.调色板(“红色”,3),'C':sns.调色板(“绿色”,3)}
sns.catplot(x='index',y='value',hue='category',data=df,kind='bar',palete=p)
plt.show()
使用Matplotlib的解决方案也不错

编辑-
我认为这归结为正确定义调色板。我想这就是你对它的定义-

p = {'A': sns.color_palette("Blues", 3), 'B': sns.color_palette('Reds', 3), 'C': sns.color_palette('Greens', 3)}
其中键是
类别中的唯一值

现有代码实际上又出现了一个错误,我没有提到-

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
是包含单个类别及其值的数据帧


我在这里遗漏了什么?

我不理解使用字符串映射到多个调色板的方法,以及为什么每个调色板都有51种颜色。您是否尝试使用像
{“A”:“blue”、“B”:“red”、“C”:“green”}
这样的单一映射?@ImportanceOfBeingErnest 51引用了我正在使用的原始数据集。为了演示,我应该把它保存3个。对此我很抱歉。此外,我认为seaborn根据类别识别色调,而不管它是字符串还是整数,这也许就是我这样使用它的原因。我并不担心调色板是如何生成的。主要的问题是数据帧非常灵活,如果需要,可以配置为简化调色板的形成。最终,我需要根据每个类别的值在条形图中看到阴影。
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}