Как добавить разные линии на каждый график (тренд временного ряда) с помощью Seaborn's FacetGrid - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу нарисовать такие графики (временные ряды велосипедов в разных местах):

, но добавить на этом графике тренд каждого временного ряда.

Как объяснено здесь: Как добавить линию сравнения ко всем графикам при использовании FacetGrid Seaborn , но с отдельной линией на каждом графике, поэтому я не достиг чтобы сделать как они.


Контекст:

Мои данные выглядят так:

    date        lieu                        nombre
0   2016-05-01  Avenue Gambetta             14.000
1   2016-05-01  Avenue Gaston Berger        2.625
2   2016-05-01  Avenue Victor Hugo          5.000
3   2016-05-01  Avenue de la République     5.250
4   2016-05-01  Avenue des Belges           5.875

и я рисую этот первый график ( выше) с этим кодом:

g = sns.FacetGrid(data, col="lieu", col_wrap=4, hue_kws={"ls":["--"]})
g.map(plt.plot, "date", "nombre")

Поворачивая мои данные, я получаю следующие временные ряды:

ts

lieu    Avenue Gambetta     Avenue Gaston Berger    Avenue Victor Hugo  Avenue de l'Europe
date                
2016-09-01  15.5    3.500   4.25    2.750
2016-10-01  8.0     3.750   3.25    3.750
2016-11-01  7.5     1.875   3.75    3.250
2016-12-01  9.5     1.125   4.00    1.125
2017-01-01  4.5     1.250   4.00    2.000

И я рассчитал тренды временного ряда с помощью:

ts_decompose = seasonal_decompose(ts, model='additive',freq=12)
ts_decompose.trend.iloc[5:10]

lieu    Avenue Gambetta     Avenue Gaston Berger    Avenue Victor Hugo  Avenue de l'Europe
date                
2017-02-01  8.9625  2.77500     3.7875  2.87500
2017-03-01  9.0750  2.69375     4.0750  3.09375
2017-04-01  9.3750  2.68125     4.3375  3.16875
2017-05-01  9.3250  2.75000     4.3125  3.24375
2017-06-01  9.3375  2.81250     4.2375  3.33125

Но я не вижу, как добавить линии с трендами на моем первом графике (я получаю без грани сетки, но не с). У вас есть идея, чтобы помочь мне?

Спасибо!

1 Ответ

1 голос
/ 25 февраля 2020

Там может быть более простой способ, но вы можете просто сделать это вручную, создав сначала несколько осей и нанеся на график каждую функцию на желаемой оси. Итак, вы сначала должны создать четыре оси:

fig, axs = plt.subplots(ncols=4)

А затем для первой оси сделать что-то вроде этого (я не уверен, как ваши данные структурированы, в основном используют ваши исходные данные для первого графика и данные тренда для второй график на той же оси:

sns.plot(x='lieu', y='nombre', data=data[data['lieu']=='Avenue Gambetta'], ax=axs[0])
sns.plot(x='lieu', y='trend', data=trenddata[trenddata['lieu']=='Avenue Gambetta'], ax=axs[0])

и далее с axs[1] с другим видом, et c.

...