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

Change marker style by a dataframe column (categorical) in seaborn stripplot

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

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

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

sns.relplot(x="day", y="total_bill", hue="time", data=tips, style="sex")

作品提供这个

有什么方法可以使用 stripplot/catplot/swarmplot 来做到这一点吗?

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

sns.relplot 是一个依赖轴级函数 sns.scatterplot 的图形级函数。 sns.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()

使用 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()