Цикл для построения boxplot
У меня есть фрейм данных, на основе которого по каждой характериститке я хочу построить боксплоты. Столбец [Сфера] - это факторная переменная, ось x в боксплоте. Когда я пытаюсь построить боксплот по любому конкретному столбцу- все получается отлично и без проблем. Но когда запускаю цикл, чтоб автоматические строить боксплоты по всем имеющимся стобцам, выходит ошибка.
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_excel('Датафрейм по всей сфере, размеченный.xlsx', sheet_name='Все')
for col in df.columns:
plt.figure(figsize=(16, 8))
x = df['Сфера']
y = df[col]
plt.subplots_adjust(bottom=0.25, top=0.79)
ax = sns.boxplot( x, y)
plt.xticks(rotation=80)
plt.draw()
plt.savefig()
ValueError: Neither the x nor y variable appears to be numeric.
Очевидно, я упускаю что-то важное, но не могу понять что. Помогите, пожалуйста. Что мне исправить, чтобы боксплоты автоматически строились в цикле по каждому столбцу [Характеристика_n], а факторной переменной при этом для каждого случая оставался столбец [Сфера]
+-------------------+------------------+------------------+------------------+------------------+------------------+
| Сфера | Характеристика_1 | Характеристика_2 | Характеристика_3 | Характеристика_4 | Характеристика_5 |
+-------------------+------------------+------------------+------------------+------------------+------------------+
| Все услуги | 17 | 22 | 17 | 21 | 17 |
| Все услуги | 36 | 40 | 16 | 4 | 24 |
| Все услуги | 20 | 28 | 22 | 18 | 30 |
| Все услуги | 34 | 36 | 10 | 8 | 20 |
| Регитстрирование | 17 | 29 | 22 | 23 | 24 |
| Регитстрирование | 28 | 20 | 26 | 12 | 16 |
| Перераспределение | 22 | 28 | 24 | 14 | 12 |
| Перераспределение | 25 | 35 | 35 | 21 | 17 |
| Все услуги | 23 | 26 | 28 | 17 | 22 |
| Регитстрирование | 27 | 27 | 31 | 16 | 12 |
| Все услуги | 29 | 39 | 32 | 23 | 22 |
| Регитстрирование | 26 | 29 | 20 | 15 | 24 |
| Регитстрирование | 24 | 29 | 16 | 15 | 14 |
| Консультирование | 40 | 28 | 28 | 32 | 18 |
| Профессиональные | 20 | 30 | 6 | 6 | 17 |
| Профессиональные | 24 | 23 | 19 | 15 | 15 |
| Профессиональные | 25 | 28 | 17 | 18 | 17 |
| Профессиональные | 15 | 16 | 12 | 3 | 18 |
| Консультирование | 20 | 19 | 20 | 16 | 24 |
| Перераспределение | 40 | 36 | 12 | 8 | 20 |
| Консультирование | 28 | 18 | 24 | 17 | 18 |
| Консультирование | 28 | 20 | 32 | 8 | 12 |
| Перераспределение | 25 | 27 | 15 | 17 | 22 |
| Перераспределение | 24 | 36 | 20 | 16 | 4 |
| Перераспределение | 23 | 22 | 29 | 18 | 24 |
| Консультирование | 20 | 28 | 24 | 8 | 24 |
| Консультирование | 30 | 28 | 22 | 21 | 20 |
| Консультирование | 38 | 12 | 22 | 4 | 31 |
| Консультирование | 20 | 12 | 24 | 8 | 12 |
| Консультирование | 30 | 24 | 24 | 20 | 29 |
| Консультирование | 24 | 32 | 19 | 13 | 32 |
| Все услуги | 35 | 34 | 17 | 14 | 14 |
| Все услуги | 25 | 29 | 31 | 23 | 16 |
| Все услуги | 36 | 33 | 28 | 18 | 18 |
| Все услуги | 33 | 36 | 20 | 13 | 7 |
| Все услуги | 27 | 21 | 26 | 17 | 26 |
+-------------------+------------------+------------------+------------------+------------------+------------------+
Ответы (2 шт):
В общем, получилось сделать вот так. Не знаю, насколько это верно
df = pd.read_excel('Датафрейм по всей сфере, размеченный.xlsx', sheet_name='Все', index_col=0)
for col in df.columns:
plt.figure(figsize=(16, 8))
x = df.index
y = df[col]
plt.subplots_adjust(bottom=0.25, top=0.79)
ax = sns.boxplot(x, y)
plt.xticks(rotation=80)
plt.show()
Не могу понять, что именно вам надо и что не выходит, но именно boхplot по столбцам Датафрейма строится на много проще:
df = pd.DataFrame(np.random.randn(20, 3),
columns=['Cl1', 'Cl2', 'Cl3'])
df.boxplot(column=['Cl1', 'Cl2', 'Cl3'])
А если по строкам - то вот так:
df['Сфера'] = pd.Series(['A', 'A', 'A', 'A', 'A',
'B', 'B', 'B', 'B', 'B',
'C', 'C', 'B', 'B', 'D',
'D', 'D', 'A', 'B', 'C'])
boxplot = df.boxplot(column=['Cl1','Cl2', 'Cl3'], by='Сфера')

