matplotlib 通过seaborn stripplot中的dataframe列(分类)更改标记样式

c9x0cxw0  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(139)

我希望将分类变量可视化为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来做到这一点?
编辑:This问题相关。然而,那里的解决方案似乎不允许生成大小的图例(并且相当过时)。

pobjuy32

pobjuy321#

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()
fslejnso

fslejnso2#

使用seaborn的对象接口(从0.12版本开始),现在可以如下所示:

import seaborn.objects as so
(
    so.Plot(tips, x="day", y="total_bill", color="time", marker="sex")
    .add(so.Dot(pointsize=7, edgecolor="white"), so.Jitter(.3))
).theme(
    {**sns.axes_style("ticks"), 'axes.spines.right': False, 'axes.spines.top': False}
)

相关问题