Блокпост Matplotlib с одним блоком для каждой категории или значения в столбце - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть один CSV, как этот (разделитель ;)

Day;col_1;col_2;col_3;month
20180101;652;0;25803;1
20180102;737;6;25677;1
20180103;653;10;27955;1
20180104;914;10;27722;1
[a lot of rows]
20181228;924;35;30191;12
20181229;721;18;28601;12
20181230;902;17;28098;12
20181231;778;30;28909;12

Я хотел бы построить на отдельной оси, значения столбцов col_1, col_2 и col_3,На каждой оси я хотел бы иметь одну отдельную рамку для каждого месяца

Я знаю, что это способ сделать это в seaborn только для одного столбца, но я хотел бы сделать это, используя pandas an matplotlib только:

import seaborn as sns
sns.boxplot(data=df, x='month', y='col1')

result_with_seaborn

После проверки в этой записи я обнаружил, что это может быть довольно приблизительночто я хочу:

df.assign(index=df.groupby('month').cumcount()).pivot('index','month','col1').plot(kind='box')

matplotlib try

Есть ли более эффективный подход?

Как добавить в один сюжет несколькооси (то есть подзаговоры) для каждого colX?

1 Ответ

1 голос
/ 06 ноября 2019

Рассмотрим matplotlib subplots и поэлементно в каждом столбце итеративно передаем оси в ax из boxplot Морского Рога для каждого числового столбца y.

fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(12,4))

for i, col in enumerate(["col_1", "col_2", "col_3"]):
   sns.boxplot(data=df, x='month', y=col, ax=ax[i])
   ax[i].set_title(col.title())

plt.tight_layout()

plt.show()
plt.clf()
plt.close()

Для демонстрации со случайными данными

np.random.seed(1142019)

df = pd.DataFrame({'Day': pd.date_range('2018-01-01', '2018-12-31'),
                   'col_1': np.random.randint(1, 10, 365),
                   'col_2': np.random.randint(10, 100, 365),
                   'col_3': np.random.randint(2500, 29999, 365)
                  })

df['month'] = df['Day'].dt.month

Над кодом генерируется этот график

Box SubPlot Output

...