Seaborn的一半(未拆分!)小提琴积木

dbo*_*ouz 10 python python-3.x pandas seaborn

根据变量,seaborn目前提供通过设置来分割小提琴功能。我想制作一个“半”小提琴图,即每个小提琴的一半被省略的图。对于每个连续变量,此类图描绘了类似于pdf的内容,仅绘制在每个类别变量的每个垂直线的一侧。split=Truehue

我设法欺骗seaborn了使用绘制的值范围之外的额外数据点和额外的虚拟色调来绘制此图形,但是我想知道是否可以在不实际更改数据集的情况下(例如在sns.violinplot()参数内)完成此操作。

例如,此图:

在此处输入图片说明

是由以下代码段创建的:

# imports
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# load dataset from seaborn
datalist = sns.get_dataset_names()
dataset_name = 'iris'
if dataset_name in datalist:
    df = sns.load_dataset(dataset_name)
else:
    print("Dataset with name: " + dataset_name + " was not found in the available datasets online by seaborn.")

# prepare data
df2 = df.append([-999,-999,-999,-999,'setosa'])
df2['huecol'] = 0.0
df2['huecol'].iloc[-1]= -999

# plot
fig = plt.figure(figsize=(6,6))
sns.violinplot(x='species',y="sepal_width",
            split=True, hue ='huecol', inner = 'quartile',
            palette="pastel", data=df2, legend=False)
plt.title('iris')

# remove hue legend
leg = plt.gca().legend()
leg.remove()
plt.ylim([1,5.0])
plt.show()
Run Code Online (Sandbox Code Playgroud)

mwa*_*kom 11

不需要修改数据:

ax = sns.violinplot(
    data=tips,
    x="day", y="total_bill", hue=True,
    hue_order=[True, False], split=True,
)
ax.legend_ = None
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


np8*_*np8 9

我一直在寻找与此类似的解决方案,但没有找到令人满意的解决方案。我最终多次调用seaborn.kdeplot,因为violinplot本质上是一个单边核密度图。

例子

categorical_kde_plot下面的函数定义

categorical_kde_plot(
    df,
    variable="tip",
    category="day",
    category_order=["Thur", "Fri", "Sat", "Sun"],
    horizontal=False,
)
Run Code Online (Sandbox Code Playgroud)

使用horizontal=True,输出将如下所示:

代码

categorical_kde_plot(
    df,
    variable="tip",
    category="day",
    category_order=["Thur", "Fri", "Sat", "Sun"],
    horizontal=False,
)
Run Code Online (Sandbox Code Playgroud)


Imp*_*est 8

答案很简单,不,seaborn 不可能不欺骗它认为存在hue礼物。

这个答案显示了如何在 matplotlib 中做到这一点,原则上同样可以应用于 seaborn violinplots,即切掉一半的小提琴路径。