matplotlib 如何用极端异常值打破箱线图轴

dfuffjeb  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(127)

我用matplotlib创建了一个箱线图。由于一个异常值,x轴的范围非常宽,并且与轴相关的框很小。是否有可能中断x轴f。即带有双斜杠“//”或其他任何东西?所以我可以看到异常值,但得到一个更大的盒子。

数据框示例

data = { 'T1': ['ja', 'ja', 'ja', 'ja', 'ja', 'nein', 'nein', 'nein', 'nein', 'nein', 'ja', 'ja', 'ja', 'ja', 'ja', 'nein', 'nein', 'nein', 'nein', 'nein', 'ja', 'ja', 'ja', 'ja', 'ja', 'nein', 'nein', 'nein', 'nein'], 'days': [2000,200,200,400,400,100,500,50,400,600,30,200,200,400,400,100,100,50,400,600,30,200,200,400,400,100,100,50,400]}
df = pd.DataFrame(data)

plot box with seaborn

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

f, ax = plt.subplots(figsize=(15,5))
sns.boxplot(data=df,
            x = df.loc[:,'days'],
            y= df.loc[:,'T1'],
           hue='T1',
            ax=ax)

ax.set_xlabel('days')
ax.legend().remove()
plt.show()

现在离群值为2000天,出于我的目的,有必要显示这个极值。但我想压缩x轴。所以我的想法是,用f。即//以在700和1750之间破坏x轴。有人有主意吗?
在尝试将其传输到我的数据后,出现了以下问题:#重命名第二列为'days_after'并创建第三列

df.loc[:, 'days_before']=0-df.loc[:, 'days_after']

如果我现在尝试用分裂的x轴绘制同一个图,它是行不通的。

[![f, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, gridspec_kw={'width_ratios':\[5,1\]}, figsize=(5,2))
sns.boxplot(data=df,
            x = df.loc\[:,'days_before'\],
            y= df.loc\[:,'T1'\],
            hue='T1',
            ax=ax1, showfliers = False)
sns.boxplot(data=df,
            x = df.loc\[:,'days_before'\],
            y= df.loc\[:,'T1'\],
            hue='T1',
            ax=ax2)

ax1.set_xlabel('days')
ax1.legend().remove()
ax2.legend().remove()

ax1.spines\['right'\].set_visible(False)
ax2.spines\['left'\].set_visible(False)
ax2.yaxis.set_visible(False)

ax1.set_xlim(right=-1750)
ax2.set_xlim(left=-750)

plt.show()][2]][2]

km0tfn4u

km0tfn4u1#

一种可能:

f, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, gridspec_kw={'width_ratios':[5,1]}, figsize=(5,2))
sns.boxplot(data=df,
            x = df.loc[:,'days'],
            y= df.loc[:,'T1'],
            hue='T1',
            ax=ax1)
sns.boxplot(data=df,
            x = df.loc[:,'days'],
            y= df.loc[:,'T1'],
            hue='T1',
            ax=ax2)

ax1.set_xlabel('days')
ax1.legend().remove()
ax2.legend().remove()

ax1.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax2.yaxis.set_visible(False)

ax1.set_xlim(right=700)
ax2.set_xlim(left=1750)

plt.show()

另见official matplotlib example
输出:

左侧为离群值
  • 注:我在这里颠倒了天数,以模拟左侧的异常值(df['days'] *= -1)。*

你需要改变几件事:

# invert the grispec ratios
f, (ax1, ax2) = plt.subplots(ncols=2, sharey=True,
                             gridspec_kw={'width_ratios':[1, 5]}, figsize=(5,2))

# change the limits
ax1.set_xlim(right=-1750)
ax2.set_xlim(left=-700)

输出:

相关问题