Как построить отдельные графики по уникальным значениям в таблице?
Есть DataFrame ds_hw_grow. Для каждого уникального course_title нужно построить линейный график, который будет отображать ежемесячный прирост студентов students_grow для своего курса на отдельном subplot.
Сейчас есть решение, как построить все графики курсов на одном полотне:
ds_hw_grow = ds_hw_grow.sort_values(["course_title", "month_start"])
ds_hw_pivot = ds_hw_grow.pivot_table(index="month_start", columns="course_title",
values="students_grow", aggfunc="sum")
ds_hw_pivot.plot(figsize=(16, 8), grid=True)
plt.show()
Надо вывести отдельный subplot для каждого курса. Все subplot в одном Figure. При этом, на всех subplot должны быть подписаны оси, и каждый sublot должен иметь заголовок по названию курса.
Как это можно сделать?
Ответы (2 шт):
Автор решения: strawdog
→ Ссылка
можно попробовать сделать так:
import matplotlib.gridspec as gridspec
fig = plt.figure(constrained_layout=True, figsize=(8, 24))
spec = gridspec.GridSpec(ncols=1, nrows=len(ds_hw_pivot.columns), figure=fig)
sn = 0
for i in ds_hw_pivot.columns:
ax = fig.add_subplot(spec[sn, 0])
ax.plot(ds_hw_pivot[i])
plt.xticks(rotation=45)
ax.set_title(i)
ax.grid(True)
ax.set_xlabel("Дата")
ax.set_ylabel("Прирост")
sn+=1
Получите, соответственно, это (с параметрами сами красоту наведете, надеюсь):

Автор решения: MaxU
→ Ссылка
Вот еще вариант:
df = pd.read_csv(r"D:\download\ds_pivot.csv", index_col=0)
df["month"] = pd.to_datetime(df["month_start"].astype(str) + "01").dt.to_period("M")
df = df.sort_values(["course_title", "month"])
df["students"] = df.groupby("course_title")["uniq_st_id"].cumsum()
n_courses = df["course_title"].nunique()
n_cols = 5
n_rows = int(np.ceil(n_courses / n_cols))
fig, axes = plt.subplots(n_rows, n_cols, figsize=(16, 8))
for ii, course in enumerate(df["course_title"].unique()):
row, col = divmod(ii, n_cols)
(df
.query("month >= '2018-01' and course_title == @course")
.set_index("month")
["students"]
.plot(ax=axes[row, col], sharey=True, title=course, grid=True))
axes[row, col].set_xlabel(None)
plt.tight_layout()

