Создание блокпоста FacetGrid в Seaborn для Python - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь создать 4x4 FacetGrid в seaborn для 4 боксплотов, каждый из которых разделен на 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])

Однако, я получаю эту ошибку от моего интерпретатора:

AttributeError: 'numpy.ndarray' object has no attribute 'boxplot'

Я запутался в том, где именно ошибка атрибутаВот.Что мне нужно изменить?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Поскольку @Lucas указывает, что оси возвращают пустой массив 2D (nrows, ncols), вы можете сгладить этот массив 1D, используя:

axes=axes.flatten()

И вы можете сохранить свой код таким же образом:

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

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])

Вывод:

enter image description here

0 голосов
/ 24 сентября 2018

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)

Итак, когда вы делаете 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])

example_plot

...