我绘制了三个实验结果的分布图,以便将它们并排比较。然而,其中一个分布(标记为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|
1条答案
按热度按时间bxgwgixi1#
正如mwaskom所指出的,解决方案是使用
scale
参数。在我的例子中,由于所有分布都有相同的样本数,我只是将scale="count"
添加到sns.violinplot方法中。scale{“area”,“count”,“width”},可选用于缩放每个小提琴宽度的方法。如果是area,则每个小提琴将具有相同的面积。如果是count,则小提琴的宽度将根据该bin中的观测数进行缩放。如果是width,则每个小提琴将具有相同的宽度。from seaborn documentation