我的目标是绘制一个堆积图表,显示 pandas df 的标准化值。使用下面的方法,Item
中的每个唯一值都有其自己的行。然后,我的目标是绘制一个堆积图,其中包含来自 Label
的标准化值,其中 Num
沿 x 轴。
但是,色调似乎为每个单独的 Item
传递一组不同的颜色。它们不一致,例如,Up
中的 A
为蓝色,而 Right
中的 A
为绿色。
我还希望分享每个 Item
的 Num
的 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()
最佳答案
直接使用FacetGrid
可能会很棘手;它基本上是在轴上进行 groupb-by 和 for 循环,并且它不跟踪任何特定于函数的状态,以确保诸如“每个色调级别应使用什么顺序”之类的问题的答案是每个方面都相同。因此,您需要以某种方式提供该信息(即 hue_order
或传递调色板字典)。事实上,documentation中有一个警告达到这个效果。
但是您通常不需要直接使用FacetGrid
;您可以使用图形级函数之一,该函数会为您完成所有簿记工作,以确保信息在各方面保持一致。在这里您将使用 displot
:
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
,我认为您是这样的想要。
关于python - Hue 和共享 x 轴不起作用 Seaborn 构面网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67015788/