如何使用子图编辑中线并向seaborn.boxenplot()添加平均值?

时间:2018-08-15 20:57:26

标签: python matplotlib seaborn

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

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)

enter image description here

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

但是我不知道该怎么做。例如,当我执行类似ax[0].plot()的操作时,这些框会相互绘制。有什么想法吗?


更新

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

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

1 个答案:

答案 0 :(得分:0)

所以我部分解决了这个问题。 尽管如此,这不是解决方法,而不是答案,我仍然希望有一个更好的答案。例如,允许我用破折号代替要点。

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

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)

enter image description here