我试图在seaborn中使用split violinplots绘制两个不同范围的变量。
以下是我到目前为止所做的:
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
df1 = pd.read_csv('dummy_metric1.csv')
df2 = pd.read_csv('dummy_metric2.csv')
fig, ax2 = plt.subplots()
sns.set_style('white')
palette1 = 'Set2'
palette2 = 'Set1'
colors_list = ['#78C850', '#F08030', '#6890F0', '#A8B820', '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']
ax1 = sns.violinplot(y=df1.Value,x=df1.modality,hue=df1.metric, palette=palette1, inner="stick")
xlim = ax1.get_xlim()
ylim = ax1.get_ylim()
for violin in ax1.collections:
bbox = violin.get_paths()[0].get_extents()
x0, y0, width, height = bbox.bounds
violin.set_clip_path(plt.Rectangle((x0, y0), width / 2, height, transform=ax1.transData))
ax1.set_xlim(xlim)
ax1.set_ylim(ylim)
ax1.set_title("dummy")
ax1.set_ylabel("metric1")
ax1.set_xlabel("Modality")
ax1.set_xticklabels(ax1.get_xticklabels(), rotation=45, ha='right')
ax1.legend_.remove()
ax2 = ax1.twinx()
ax2 = sns.violinplot(y=df2.Value,x=df2.modality,hue=df2.metric, palette=palette2, inner=None)
xlim = ax2.get_xlim()
ylim = ax2.get_ylim()
for violin in ax2.collections:
bbox = violin.get_paths()[0].get_extents()
x0, y0, width, height = bbox.bounds
violin.set_clip_path(plt.Rectangle((x0, y0), width / 2, height, transform=ax2.transData))
ax2.set_xlim(xlim)
ax2.set_ylim(ylim)
ax2.set_ylabel("Metric2")
ax2.set_xticklabels(ax2.get_xticklabels(), rotation=45, ha='right')
ax2.legend_.remove()
fig.tight_layout()
plt.show()
然而,我无法使用ax2小提琴的正确部分。这是输出。
当我执行violin.set_clip_path(plt.Rectangle((width/2, y0), width / 2, height, transform=ax2.transData))
时,我得到这样的结果:
有人能解释一下我错过了什么吗?还有,我怎么能管理有inner="stick"
?
TIA
1条答案
按热度按时间4nkexdtk1#
这里有一个使用
split=True
和虚拟数据强制分割空半部分的方法。对于左半部分,metric
被设置为1
用于真实的数据,2
用于虚拟数据。对于右半部分,反之亦然。我们需要确保所有 Dataframe 对modality
列使用相同的分类顺序,以避免混淆。PS:这是原始代码的一个可能的改编:
plt.Rectangle((x0+width/2, y0), width/2, height)
将小提琴夹在ax2上sns.violinplot()
的ax=
参数指示正确的子图modality
使用相同的分类顺序ax1
:循环遍历这些行,得到它们的x0
和x1
,然后将行缩短为x0
和(x0+x1)/2
ax2
:循环遍历这些行,得到它们的x0
和x1
,然后将行缩短为(x0+x1)/2
和x1
ax2
的图例,将其与ax1
的图例合并,然后删除ax1
的图例