boxplot для всех данных в фрейме данных: ошибка "numpy .ndarray 'объект не имеет атрибута" boxplot "" - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь отобразить в подпункте все поля , соответствующие каждому столбцу в моем фрейме данных df .

Я прочитал этот вопрос: Подзаговор для морского участка и попытался реализовать данное решение:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

d = {'col1': [1, 2, 5.5, 100], 'col2': [3, 4, 0.2, 3], 'col3': [1, 4, 6, 30], 'col4': [2, 24, 0.2, 13], 'col5': [9, 84, 0.9, 3]}
df = pd.DataFrame(data=d)

names = list(df.columns)
f, axes = plt.subplots(round(len(names)/3), 3)  
y = 0;
for name in names:
    sns.boxplot(x= df[name], ax=axes[y])
    y = y + 1

К сожалению, я получаю ошибку

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-111-489a538377fc> in <module>
      3 y = 0;
      4 for name in names:
----> 5     sns.boxplot(x= df[name], ax=axes[y])
      6     y = y + 1
AttributeError: 'numpy.ndarray' object has no attribute 'boxplot'

Я понимаю, что есть проблема с df[name], но я не вижу, как ее исправить.

Может ли кто-нибудь указать мне правильное направление?

Большое спасибо.

1 Ответ

1 голос
/ 30 апреля 2020

Проблема возникает при передаче ax=axes[y] в boxplot. axes - это массив 2-d numpy с формой (2, 3), который содержит сетку осей Matplotlib, которую вы запросили. Таким образом, axes[y] является массивом 1-d numpy, который содержит три объекта Matplotlib AxesSubplot. Я подозреваю, что boxplot пытается передать этот аргумент, и ожидает, что это будет объект с методом boxplot. Вы можете исправить это, индексировав axes с соответствующей строкой и столбцом, который вы хотите использовать.

Вот ваш сценарий с небольшим изменением для этого:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

d = {'col1': [1, 2, 5.5, 100], 'col2': [3, 4, 0.2, 3], 'col3': [1, 4, 6, 30], 'col4': [2, 24, 0.2, 13], 'col5': [9, 84, 0.9, 3]}
df = pd.DataFrame(data=d)

names = list(df.columns)
f, axes = plt.subplots(round(len(names)/3), 3)  
y = 0;
for name in names:
    i, j = divmod(y, 3)
    sns.boxplot(x=df[name], ax=axes[i, j])
    y = y + 1

plt.tight_layout()
plt.show()

Сюжет то есть генерирует это

plot

...