我试图从seaborn文档中创建一个像this one这样的数字,但是由色调决定了stripplot的边缘颜色。这是我的尝试:
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
答案 0 :(得分:2)
edgecolor参数直接传递给plt.scatter
。目前你给它一个4种颜色的列表。我不确定在那种情况下我会期望它做什么(我不确定你为什么最终会看到你在这里看到的东西),但我不希望它“起作用”。
这项工作的理想方法是使用“空心圆”标记字形,根据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
调色板加剧了问题,因为柠檬绿和青色中间色最终非常相似。我可以想象这样可以很好地工作的情况,例如,一个色调变量,有两个级别,由灰色和亮色表示,你要强调后者。