通过seaborn stripplot中的数据框列(分类)更改标记样式

Dev*_*vil 3 python matplotlib seaborn jupyter jupyter-notebook

我希望将分类变量可视化为seaborn stripplot 中的标记样式,但这似乎并不容易。是否有捷径可寻。例如,我正在尝试运行这段代码

tips = sns.load_dataset("tips")
sns.stripplot(x="day", y="total_bill", hue="time", style="sex", jitter=True, data=tips)
Run Code Online (Sandbox Code Playgroud)

这失败了。另一种方法是使用 relplot,它确实提供了选项,但无法插入,jitter这使得可视化效果不太好。

sns.relplot(x="day", y="total_bill", hue="time", data=tips, style="sex")
Run Code Online (Sandbox Code Playgroud)

提供此的作品

在此输入图像描述

有没有办法使用 stripplot/catplot/swarmplot 来做到这一点?

编辑:这个问题是相关的。然而,那里的解决方案似乎不允许生成尺寸图例(并且相当过时)。

Joh*_*anC 5

sns.relplot是一个图形级函数,它依赖于轴级函数sns.scatterplotsns.scatterplot有一个参数x_jitter不幸的是目前没有效果(seaborn 0.11.2)。

您可以通过掌握点的位置、添加一些随机抖动并再次分配这些位置来模拟该功能。

这是一个例子:

from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np

tips = sns.load_dataset("tips")
ax = sns.scatterplot(x="day", y="total_bill", hue="time", data=tips, style="sex")
for points in ax.collections:
    vertices = points.get_offsets().data
    if len(vertices) > 0:
        vertices[:, 0] += np.random.uniform(-0.3, 0.3, vertices.shape[0])
        points.set_offsets(vertices)
xticks = ax.get_xticks()
ax.set_xlim(xticks[0] - 0.5, xticks[-1] + 0.5) # the limits need to be moved to show all the jittered dots
sns.move_legend(ax, bbox_to_anchor=(1.01, 1.02), loc='upper left')  # needs seaborn 0.11.2
sns.despine()
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)

sns.带抖动的散点图

sns.relplot可以迭代所有子图:

g = sns.relplot(x="day", y="total_bill", hue="time", data=tips, style="sex")
for ax in g.axes.flat:
    for points in ax.collections:
        vertices = points.get_offsets().data
        if len(vertices) > 0:
            vertices[:, 0] += np.random.uniform(-0.3, 0.3, vertices.shape[0])
            points.set_offsets(vertices)
    xticks = ax.get_xticks()
    ax.set_xlim(xticks[0] - 0.5, xticks[-1] + 0.5) # the limits need to be moved to show all the jittered dots
plt.show()
Run Code Online (Sandbox Code Playgroud)