a11*_*a11 8 python scatter seaborn
我有一个 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,
)
Run Code Online (Sandbox Code Playgroud)
翻转“hue_order”hue_order=['N', 'Y', ]
不会改变绘图。如何让“Y”类别绘制在“N”类别之上?我的实际数据具有重复的 x,y 坐标,这些坐标由类别列区分。
mwa*_*kom 10
发生这种情况的原因是,与大多数绘图函数不同,scatterplot
它在构建绘图时不会(内部)迭代色调级别。它绘制单个散点图,然后使用向量设置元素的颜色。这样做是为了让您最终不会将最终色调级别的所有点放在所有倒数第二个色调级别的所有点之上......等等。但这意味着散点图 z-排序对色调排序不敏感,仅反映输入数据中的顺序。
因此,您可以使用所需的色调顺序对输入数据进行排序:
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
)
Run Code Online (Sandbox Code Playgroud)
可能有一种更有效的方法可以实现 pandas 内置的“按唯一值列表排序”;我不知道。
TLDR:在绘图之前,对数据进行排序,以便主色出现在数据的最后。在这里,它可能只是:
test = test.sort_values('cat') # ascending = True
Run Code Online (Sandbox Code Playgroud)
然后你得到:
看起来这hue_order
并不影响绘制事物的顺序(或 z 顺序)。相反,它会影响颜色的分配方式。例如,如果您没有指定类别到颜色的特定映射(即您仅使用颜色列表或调色板),则此参数可以确定是否'N'
获取'Y'
调色板的第一个(以及获取第二个)颜色。 参考资料部分中有一个示例展示了这种行为hue_order
。当您dict
已经将类别链接到颜色 ( colors = {'N': 'gray', 'Y': 'blue'}
) 时,它似乎只会影响图例中标签的顺序,正如您可能已经看到的那样。
所以关键是确保你想要在顶部的颜色是最后绘制的(因此“在顶部”)。我还假设该hue_order
参数会按照您的预期进行,但显然不是!