Seaborn stripplot根据色调/调色板设置edgecolor

时间:2015-04-20 22:57:22

标签: matplotlib seaborn

我试图从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)

enter image description here

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

我使用的是seaborn 0.6.dev

1 个答案:

答案 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)

enter image description here

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