在 Seaborn 中为 python 创建箱线图 FacetGrid

Jos*_*ess 6 python data-visualization boxplot seaborn data-science

我正在尝试在seaborn中为4个箱线图创建一个4x4 FacetGrid,每个箱线图根据虹膜数据集中的虹膜种类分为3个箱线图。目前,我的代码如下所示:

sns.set(style="whitegrid")
iris_vis = sns.load_dataset("iris")

fig, axes = plt.subplots(2, 2)

ax = sns.boxplot(x="Species", y="SepalLengthCm", data=iris, orient='v', 
    ax=axes[0])
ax = sns.boxplot(x="Species", y="SepalWidthCm", data=iris, orient='v', 
    ax=axes[1])
ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris, orient='v', 
    ax=axes[2])
ax = sns.boxplot(x="Species", y="PetalWidthCm", data=iris, orient='v', 
    ax=axes[3])
Run Code Online (Sandbox Code Playgroud)

但是,我从翻译中收到此错误:

AttributeError: 'numpy.ndarray' object has no attribute 'boxplot'
Run Code Online (Sandbox Code Playgroud)

我对属性错误到底在哪里感到困惑。我需要改变什么?

Ian*_*son 9

不是对您的错误的直接答案,但如果您要使用seaborn,您应该尝试坚持使用“长”或“整洁”数据(https://seaborn.pydata.org/tutorial/data_struct.html#long-表单数据)。

我假设您的原始数据集很宽(观察的每个特征的列)。如果像这样融化数据集:

iris = iris.melt(id_vars='target')

print(iris.head())

   target           variable  value
0  setosa  sepal length (cm)    5.1
1  setosa  sepal length (cm)    4.9
2  setosa  sepal length (cm)    4.7
3  setosa  sepal length (cm)    4.6
4  setosa  sepal length (cm)    5.0
Run Code Online (Sandbox Code Playgroud)

您将能够使用catplotseabornkind='box'

sns.catplot(
    data=iris, x='target', y='value',
    col='variable', kind='box', col_wrap=2
)
Run Code Online (Sandbox Code Playgroud)

箱形图

  • 如果您想为每个变量获得更高的分辨率,请在 sns.catplot 调用中添加 sharey = False 以使每个变量的 y 轴不同 (2认同)

Luc*_*cas 3

axes形状是(nrows, ncols). 在这种情况下是:

array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f4267f425f8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f4267f1bb38>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7f4267ec95c0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f4267ef9080>]],
      dtype=object)
Run Code Online (Sandbox Code Playgroud)

所以,当你这样做时,ax=axes[0]你得到的是一个数组而不是轴。尝试:

fig, axes = plt.subplots(2, 2)

ax = sns.boxplot(x="Species", y="SepalLengthCm", data=iris, orient='v', 
    ax=axes[0, 0])
ax = sns.boxplot(x="Species", y="SepalWidthCm", data=iris, orient='v', 
    ax=axes[0, 1])
ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris, orient='v', 
    ax=axes[1, 0])
ax = sns.boxplot(x="Species", y="PetalWidthCm", data=iris, orient='v', 
    ax=axes[1, 1])
Run Code Online (Sandbox Code Playgroud)

示例图