python - Seaborn 散点图设置空心标记而不是填充标记
问题描述
使用 Seaborn 散点图,如何将标记设置为空心圆而不是实心圆?
这是一个简单的例子:
import pandas as pd
import seaborn as sns
df = pd.DataFrame(
{'x': [3,2,5,1,1,0],
'y': [1,1,2,3,0,2],
'cat': ['a','a','a','b','b','b']}
)
sns.scatterplot(data=df, x='x', y='y', hue='cat')
我尝试了以下但没有成功;其中大多数不会引发错误,而是会产生与上面相同的图。我认为这些不起作用,因为颜色是使用hue
参数设置的,但我不确定修复是什么。
sns.scatterplot(data=df, x='x', y='y', hue='cat', facecolors = 'none')
sns.scatterplot(data=df, x='x', y='y', hue='cat', facecolors = None)
sns.scatterplot(data=df, x='x', y='y', hue='cat', markerfacecolor = 'none')
sns.scatterplot(data=df, x='x', y='y', hue='cat', markerfacecolor = None)
with sns.plotting_context(rc={"markerfacecolor": None}):
sns.scatterplot(data=df, x='x', y='y', hue='cat')
解决方案
原则上,您应该能够使用 来创建一个圆形标记fillstyle="none"
,但是那里有一些复杂的问题,并且它目前不能像您希望的那样工作。
最简单的纯 seaborn 解决方案是利用您可以使用任意乳胶符号作为标记的事实:
sns.scatterplot(data=df, x='x', y='y', hue="cat", marker="$\circ$", ec="face", s=100)
这有点有限,因为您无法控制圆的厚度。
混合 seaborn-matplotlib 方法更灵活,但也更麻烦(您需要自己创建图例):
palette = {"a": "C0", "b": "C1"}
kws = {"s": 70, "facecolor": "none", "linewidth": 1.5}
ax = sns.scatterplot(
data=df, x='x', y='y',
edgecolor=df["cat"].map(palette),
**kws,
)
handles, labels = zip(*[
(plt.scatter([], [], ec=color, **kws), key) for key, color in palette.items()
])
ax.legend(handles, labels, title="cat")
第三种选择是使用FacetGrid
. 这不太灵活,因为情节必须在自己的图中。但这相当简单;另一个答案使用FacetGrid
但它有点过度设计,因为它忘记了hue_kws
参数:
palette = ["C0", "C1"]
g = sns.FacetGrid(
data=df, hue="cat",
height=4, aspect=1.25,
hue_kws={"edgecolor": palette},
)
g.map(plt.scatter, "x", "y", facecolor="none", lw=1.5)
g.add_legend()
推荐阅读
- react-native - 在对齐模式下反应原生和阿拉伯文本
- excel - 如何从尚未标准化的大表中提取特定数据?
- node.js - 尝试安装nodejs 10时Nodejs安装了错误的版本
- php - 当我的索引和创建路由工作时,为什么我的编辑和删除方法会返回“404 not found”
- wpf - WPF DataGrid Header 在执行时看起来不同
- javascript - 使用 node.js 抓取表格不显示任何结果
- python - 如何在 Python 中调用 GetLogicalProcessorInformation()?
- javascript - 需要没有引导支持的拆分下拉菜单
- firebase - 创建一个动态列表,该列表使用我的小部件中的流构建器正确更新
- python - 使用 selenium 进行 Web 抓取没有任何价值