为什么相同分布的小提琴图形状不同? (seaborn/python)

Why is the violin plot shape different for the same distribution? (seaborn/python)

我正在绘制实验结果的三个分布,以便将它们并排比较。但是,其中一个分布(标记为 MLP)是固定的(每个图中的分布相同),所以我希望它在不同的图中具有相同的形状,假设我已经设置固定的 y 轴范围 (0,1).

我正在使用 seaborn.violinplot (Python 3) 生成绘图。查看一些示例:

其他分布显然影响了它的形状,但我不知道原因。 我试图在绘制 dists 之前设置一个种子,并且还选择了 bw=0.2、bw='scott' 和 bw='silverman',但是其中 none 有效。为什么MLP小提琴形状不一样?

这是我用来生成这些图的代码:

for metric in metrics:
    random.seed(42)
    np.random.seed(42)
    file_name = f"{file_name_base}{metric}/{cancer}_{strategy_translation[strategy]}_{threshold_str}.pdf" 
    ax = sns.violinplot(data=df, x='Algorithm', y=metric, palette='turbo',
                        inner=None, linewidth=0, saturation=0.4)
    ax.set(ylim=(0, 1))
    sns.boxplot(x='Algorithm', y=metric, data=df, palette='turbo', width=0.3,
                boxprops={'zorder': 2}, ax=ax).set(title=title)

    for i, algorithm in enumerate(algorithms):
        median = df.loc[df['Algorithm']==algorithm][metric].median()
        plt.axhline(y=median, color=colors[i], linestyle ="--")

    plt.savefig(file_name)
    plt.clf()

df 对象看起来像

Metric 1 Metric 2 ... Algorithm
0.1 0.8 MLP
0.2 0.81 MLP
0.12 0.77 GAT
0.1 0.82 GAT
0.17 0.89 GCN
0.13 0.79 GCN

正如 mwaskom 所指出的,解决方案是使用 scale 参数。 在我的例子中,由于所有分布都有相同数量的样本,我只是将 scale="count" 添加到 sns.violinplot 方法。

scale{“area”, “count”, “width”}, optional The method used to scale the width of each violin. If area, each violin will have the same area. If count, the width of the violins will be scaled by the number of observations in that bin. If width, each violin will have the same width. from seaborn documentation