Python 色调和共享x轴不工作Seaborn镶嵌面网格

Python 色调和共享x轴不工作Seaborn镶嵌面网格,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我的目标是绘制一个堆叠图表,显示一个数据集的标准化值。使用下面的命令,项中的每个唯一值都有自己的行。然后,我打算绘制一个包含Label标准化值的堆叠图,并沿x轴绘制Num 然而,色调似乎为每个项目传递了一组不同的颜色。它们不一致,例如,Up中的A为蓝色,而Right中的A为绿色 我还希望共享Num的x轴,每个项目的x轴都是一致的。这些值未与相应的x轴对齐 import pandas as pd import numpy as np df = pd.DataFrame({ '

我的目标是绘制一个堆叠图表,显示一个数据集的标准化值。使用下面的命令,
中的每个唯一值都有自己的行。然后,我打算绘制一个包含
Label
标准化值的堆叠图,并沿x轴绘制
Num

然而,色调似乎为每个
项目传递了一组不同的颜色。它们不一致,例如,
Up
中的
A
为蓝色,而
Right
中的
A
为绿色

我还希望共享
Num
的x轴,每个
项目的x轴都是一致的。这些值未与相应的x轴对齐

import pandas as pd
import numpy as np

df = pd.DataFrame({      
    'Num' : [1,2,1,2,3,2,1,3,2,2,1,2,3,3,1,3],
    'Label' : ['A','B','C','B','B','C','C','B','B','A','C','A','B','A','C','A'],   
    'Item' : ['Up','Left','Up','Left','Down','Right','Up','Down','Right','Down','Right','Up','Up','Right','Down','Left'],        
   })

g = sns.FacetGrid(df, 
                  row = 'Item', 
                  row_order = ['Up','Right','Down','Left'],                           
                  aspect = 2, 
                  height = 4, 
                  sharex = True,
                  legend_out = True
                  )

g.map_dataframe(sns.histplot, x = 'Num', hue = 'Label', multiple = 'fill', shrink = 0.8, binwidth = 1)
g.add_legend()

直接使用FaceGrid可能很棘手;它基本上是在轴上执行GROUPBY和for循环,并且它不跟踪任何特定于功能的状态,这些状态将需要确保“每个色调级别应使用什么顺序”等问题的答案在每个方面都是相同的。因此,您需要以某种方式提供该信息(即,
hue\u order
或传递调色板字典)。事实上,有一个警告是关于这一点的

但是您通常不需要直接使用
FacetGrid
;您可以使用图形级别的函数之一,该函数为您完成所有簿记工作,以确保信息跨面对齐。在这里,您可以使用
显示

sns.displot(
    data=df, x="Num", hue="Label",
    row='Item', row_order=['Up','Right','Down','Left'],
    multiple="fill", shrink=.8, discrete=True,
    aspect=4, height=2,
)


请注意,我在这里对您的代码做了另一个更改,即使用
discrete=True
而不是
binwidth=1
,这是我认为您需要的。

如果
g.map\u dataframe()
在使用
histplot
和相关函数调用时向
displaot
发出一些警告提示,可能会有所帮助?(对于
multiple='fill'
,可能ylabel会有所不同,类似于“比例”之类的东西。)不太可能推断带有轴级函数的
FaceGrid
的特定用法是否会成为问题。。。大多数图形级函数都在内部执行此操作。。。这只是数据格式正确/元数据正确的问题。我所能做的就是在文档中强烈指出,直接使用
FaceGrid
是高级的/只有在您知道自己在做什么的情况下才应该这样做。