使用日期时间数据框绘制单独的季节性图

Plot seperate seasonal plots with datetime dataframe

我有一个数据框 df:

    Date    station_name    BD_val      TEMIS_val   ratio       longitude   latitude
0   2003-01 29              295.448387  291.225806  -1.429211   158.950 -   54.500
1   2003-01 57              282.258065  279.290323  -1.051429   -26.130     -75.360
2   2003-01 57              282.258065  279.290323  -1.051429   -26.600     -75.583
3   2003-01 101             310.516129  304.677419  -1.880324   39.580      -69.010
4   2003-01 111             268.071429  274.000000  2.211564    -24.800     -89.983
... ... ... ... ... ... ... ...
153 2003-12 400             294.733333  300.000000  1.786926    11.450      -70.450
154 2003-12 454             298.176667  294.000000  -1.400736   -67.106     -68.130
155 2003-12 473             308.433333  316.000000  2.453258    -70.850     -53.140
156 2003-12 478             309.306667  304.000000  -1.715665   76.380      -69.370

其中 Date 为日期时间格式。

我想创建 4 个地块:从 1 月到 3 月,每个地块为三个月,其中 latitude 在 x 轴上,ratio 在 y 轴上.我希望每个月都成为该特定子图中的一行。

我该怎么做?

到目前为止,我使用了以下方法:

for key, grp in comp_df_complete.groupby(['Date']):
    grp = grp.sort_values(by=['latitude'])
    plt.plot(grp.latitude, grp.ratio)

plt.legend()
plt.show()

结果如下图:

这很接近,问题是它很杂乱,而且我希望 4 个季节中的每个月也能在 4 个多面图中看到。此外,图例似乎不适用于此方法,但这是另一个问题:

No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.

我最终想要的是一个类似于这个的图:

但 x 轴为 latitude,y 轴为 ratio,特定季节每个月的每个地块三行。

假设 Date 中的值是字符串,我们的想法是添加一个列给出 'season' 并且对于每个列,按 Date 分组以获得给定季节的每个月的行:

df['season'] = df['Date'].apply(lambda x: (int(x[-2:])-1)//3+1)
fig = plt.figure(figsize=(16, 12))

for i in range(4):  
    ax = fig.add_subplot(2, 2, i+1)
    for key, grp in df[df['season']==i+1].groupby(['Date']):
        grp = grp.sort_values(by=['latitude'])
        ax.plot(grp.latitude, grp.ratio)
plt.show()

编辑:如果 'Date' 是日期时间 -> df['season'] = df['Date'].dt.quarter