如何使用Seaborn的FacetGrid在每个图上(时间序列趋势)添加不同的线

时间:2020-02-24 14:40:37

标签: python time-series seaborn facet-grid

我想绘制这样的图形(不同位置的自行车计数的时间序列):

但是要在此图上添加每个时间序列的趋势。

就像在这里解释的那样:How to add a comparison line to all plots when using Seaborn's FacetGrid,但是每张图上都有不同的线,所以我没有做到像他们一样。


上下文:

我的数据如下:

    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

但是我没有找到如何在我的第一个图表上添加趋势线(我没有facetgrid却没有实现)。 您有帮助我的想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

也许有一种更简单的方法,但是您可以通过首先创建多个轴并在所需的轴上绘制每个功能来手动进行操作。因此,您首先要创建四个轴:

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]代替,以此类推,等等。