Seaborn stripplot 设置边缘颜色基于 hue/palette

Seaborn stripplot set edgecolor based on hue/palette

我正在尝试根据 seaborn 文档创建一个类似于 this one 的图形,但带状图的边缘颜色由色调决定。这是我的尝试:

import seaborn as sns
df = sns.load_dataset("tips")
ax = sns.stripplot(x="sex", y="tip", hue="day", data=df, jitter=True,
                   edgecolor=sns.color_palette("hls", 4),
                   facecolors="none", split=False, alpha=0.7)

但是男性和女性的调色板似乎不同。如何为两个类别使用相同的调色板?

我正在使用 seaborn 0。6.dev

edgecolor 参数直接传递给 plt.scatter。目前你给它一个 4 种颜色的列表。我不确定在那种情况下我会期望它做什么(我也不确定为什么你会得到你在这里看到的结果),但我不会期望它 "work"。

完成这项工作的理想方式是使用 "hollow circle" 标记字形,根据 color(或 facecolor)属性而不是边缘为边缘着色。虽然将其作为核心 matplotlib 中的一个选项会很好,但存在一些不一致之处可能使其无法使用。但是,可以将一个自定义字形拼凑在一起来达到目的:

import numpy as np
import matplotlib as mpl
import seaborn as sns

sns.set_style("whitegrid")
df = sns.load_dataset("tips")

pnts = np.linspace(0, np.pi * 2, 24)
circ = np.c_[np.sin(pts) / 2, -np.cos(pts) / 2]
vert = np.r_[circ, circ[::-1] * .7]

open_circle = mpl.path.Path(vert)

sns.stripplot(x="sex", y="tip", hue="day", data=df,
              jitter=True, split=False,
              palette="hls", marker=open_circle, linewidth=0)

FWIW 我还应该提一下,使用这种方法时一定要小心,因为颜色变得更难区分。 hls 调色板加剧了这个问题,因为石灰绿和青色中间色最终非常相似。不过,我可以想象这会很好地工作的情况,例如具有两个级别的色调变量,由灰色和明亮的颜色表示,您想要强调后者。