Seaborn散点图无法使用hue_order参数

7
我有一个Seaborn散点图,尝试使用'hue_order'控制绘图顺序,但它并没有按照我的预期工作(我无法使蓝色点显示在灰色点之上)。
x = [1, 2, 3, 1, 2, 3]
cat = ['N','Y','N','N','N']
test = pd.DataFrame(list(zip(x,cat)), 
                  columns =['x','cat']
                 )
display(test)

colors = {'N': 'gray', 'Y': 'blue'}
sns.scatterplot(data=test, x='x', y='x', 
                hue='cat', hue_order=['Y', 'N', ],
                palette=colors,
               )

enter image description here

将'hue_order'翻转为hue_order=['N', 'Y', ]不会改变图表。我如何让'Y'类别显示在'N'类别之上?我的实际数据具有由类别列区分的重复x,y坐标。

在重叠的情况下,您是否计划使用不同的符号/形状/大小来显示它们两个? - Trevis
不,我想要完全相同的形状和大小,用蓝色绘制在灰色上。如果有蓝色,我不想看到灰色。 - a11
2个回答

9
这是由于与大多数绘图函数不同,scatterplot在构造图时没有(内部)迭代色调级别。它绘制了一个散点图,然后使用向量设置元素的颜色。这样做是为了避免最终色调级别中的所有点覆盖在倒数第二个色调级别中的所有点之上,以此类推。但这意味着,scatterplot的z-ordering对色调顺序不敏感,仅反映输入数据的顺序。因此,您可以使用所需的hue顺序对输入数据进行排序。
hue_order = ["N", "Y"]
colors = {'N': 'gray', 'Y': 'blue'}
sns.scatterplot(
    data=test.sort_values('cat', key=np.vectorize(hue_order.index)),
    x='x', y='x',
    hue='cat', hue_order=hue_order,
    palette=colors, s=100,  # Embiggen the points to see what's happening
)

enter image description here

可能有更有效的方法在pandas中实现“按独特值列表排序”的功能,但我不确定。


6

简述: 在绘图之前,对数据进行排序,使得占主导地位的颜色出现在数据的最后。这里可以这样做:

test = test.sort_values('cat') # ascending = True

然后你会得到:

enter image description here


似乎 hue_order 不影响绘制时事物的排序(或z-order),而是影响颜色的分配。例如,如果没有指定类别到颜色的特定映射(即仅使用颜色列表或调色板),则此参数可以确定调色板中的第一个颜色是 'N' 还是 'Y' (以及哪个是第二个)。在 这里hue_order 部分有一个展示这种行为的例子。当您已经有了将类别链接到颜色的字典时(colors = {'N': 'gray', 'Y': 'blue'}),它似乎只影响图例标签的顺序,就像您可能已经看到的那样。

所以关键是要确保您想要的颜色最后绘制(因此“在顶部”)。我也本来认为 hue_order 参数会按照您的预期进行操作,但显然不会!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接