使用日期时间数据框绘制单独的季节性图
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
我有一个数据框 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