matplotlib 为什么小提琴的曲线形状对于相同的分布是不同的?

2izufjch  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(161)

我绘制了三个实验结果的分布图,以便将它们并排比较。然而,其中一个分布(标记为MLP)是固定的(每个图中的分布相同),因此我希望它在不同的图中具有相同的形状,假设我设置了固定的y轴范围(0,1)。
我使用seaborn.violinplot(Python 3)来生成图。请看一些例子:

其他分布明显影响了它的形状,但我不知道原因。我试图在绘制dists之前设置一个种子,并选择bw=0.2,bw ='scott'和bw ='silverman',但这些都不起作用。为什么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对象看起来像
| 度量1|度量2|……|算法|
| --------------|--------------|--------------|--------------|
| 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|

bxgwgixi

bxgwgixi1#

正如mwaskom所指出的,解决方案是使用scale参数。在我的例子中,由于所有分布都有相同的样本数,我只是将scale="count"添加到sns.violinplot方法中。
scale{“area”,“count”,“width”},可选用于缩放每个小提琴宽度的方法。如果是area,则每个小提琴将具有相同的面积。如果是count,则小提琴的宽度将根据该bin中的观测数进行缩放。如果是width,则每个小提琴将具有相同的宽度。from seaborn documentation

相关问题