首页 > 解决方案 > 如何使用子图编辑中线并为 seaborn.boxenplot() 添加平均值?

问题描述

我在这样的两个子图中使用seaborn boxenplot / letter-value 图

data = np.random.randn(100, 5)
fig, ax = plt.subplots(figsize=(12,8), ncols=1, nrows=2,
                       gridspec_kw={'height_ratios':[len(mat_cat), 1]})
sns.set_style('whitegrid')
sns.boxenplot(data=data[:][:4], ax=ax[0], orient='h')
sns.boxenplot(data=data[:][5], ax=ax[1], orient='h')
ax[0].set_xlim(-3, 3)
ax[1].set_xlim(-2, 2)

在此处输入图像描述

现在我想编辑中间破折号的外观(例如红线而不是黑色),并在图中添加平均值(例如蓝色虚线)。

但是我不知道该怎么做。例如,当我做类似ax[0].plot()的事情时,盒子会被绘制在彼此的顶部。有任何想法吗?


更新

我想出了如何编辑现有的中位数。如果我添加以下代码,上部子图的中间虚线将变为虚线、红色和 20% 透明。

for l in ax[0].lines:
    l.set_linestyle('--')
    l.set_color('r')
    l.set_alpha(0.8)    

标签: pythonmatplotlibseaborn

解决方案


所以我部分解决了这个问题。尽管如此,这与其说是答案,不如说是一种解决方法,我仍然希望有一个更好的解决方法。例如,这允许我使用破折号而不是点来表示方法。

为了固定中位数,我使用以下内容:

for l in ax[0].lines:
    l.set_linestyle('--')
    l.set_color('r')
    l.set_alpha(0.8)   

为了添加手段,我(ab-)sns.swarmplot()ax关键字一起使用:

sns.swarmplot(x=[m.mean() for m in data[:][:4]], y=np.arange(len(data[:][:4])), 
              color='0.3', edgecolor='0.3', linewidth=3,
              ax=ax[0], orient='h')

所以总代码如下所示:

data = np.random.randn(100, 5)
fig, ax = plt.subplots(figsize=(12,8), ncols=1, nrows=2, 
                       gridspec_kw={'height_ratios':[len(mat_cat), 1]})
sns.set_style('whitegrid')
sns.boxenplot(data=data[:][:4], ax=ax[0],
             orient='h')
sns.swarmplot(x=[m.mean() for m in data[:][:4]], y=np.arange(len(data[:][:4])), color='0.3', edgecolor='0.3', linewidth=3,
              ax=ax[0], orient='h')
for l in ax[0].lines:
    l.set_linestyle('--')
    l.set_color('r')
    l.set_alpha(0.8)    
sns.boxenplot(data=data[:][5], ax=ax[1], orient='h')
for l in ax[1].lines:
    l.set_linestyle('--')
    l.set_color('r')
    l.set_alpha(0.8)    
sns.swarmplot(x=data[:][5].mean(), y=np.arange(1), 
              color='0.3', edgecolor='0.3', linewidth=3,
              ax=ax[1], orient='h')
ax[0].set_xlim(-3, 3)
ax[1].set_xlim(-2, 2)

在此处输入图像描述


推荐阅读