如何循环为一天中的每个小时的地理空间数据创建图?
How to loop to create plots for each hour of day of geospatial data?
我正在尝试创建一周内道路交通的动画地图(通过生成多个绘图),其中道路的粗细度由一天中特定时间的交通量表示。
这就是我正在寻找的东西(但对于每天的每个小时):
数据的结构如下所示:
HMGNS_LNK_ID geometry DOW Hour Normalised Value
2 MULTILINESTRING ((251... 1 0 0.233623
2 MULTILINESTRING ((251... 1 1 0.136391
2 MULTILINESTRING ((251... 1 2 0.108916
DOW
代表 'day of the week'(1 = 星期一),因此对于 7 天中每一天的每个 Hour
,我想根据值绘制道路厚度的地图Normalised Value
.
我在尝试使用此代码循环时遇到问题:
for dow in df['DOW']:
fig, ax = plt.subplots(1)
day_df = df[df['DOW']==dow]
for hour in day_df['Hour']:
day_hour_df = day_df[day_df['Hour']==hour]
day_hour_df.plot(ax=ax, linewidth=day_hour_df['Normalised Value'])
plt.savefig("day{}_hour{}.png".format(dow, hour), dpi = 200, facecolor='#333333')
问题是这些数字只在第 1 天保存,所以直到 day1_hour_23
之后,它又回到 day1_hour0
并用新的东西覆盖情节。我不明白为什么它停在 DOW
2.
我什至不确定数据结构是否正确。我将不胜感激任何帮助。请在我的 repo.
中找到完整代码
干杯!
问题出在循环和子集 df
的方式上。让我们详细了解一下循环。第一次在外循环中,dow
将是 1
,而 day_df = df[df['DOW']==dow]
将 select 列 DOW
中具有 1
的所有行。现在,内部循环遍历 selected 行并创建 day1_hour0
到 day1_hour23
。内循环完成,太棒了。
现在我们第二次进入外循环,dow
又是 1
。 day_df = df[df['DOW']==dow]
将 select 列 DOW
中具有 1
的所有行,即上次通过外循环使用的同一组行。因此,它再次(重新)将 day1_hour0
写入 day1_hour23
。
我建议使用 (geo)pandas.groupby:
for dow, day_gdf in df.groupby("DOW"):
for hour, day_hour_gdf in day_gdf.groupby("Hour"):
fig, ax = plt.subplots(1)
print(f"Doing dow={dow}, hour={hour}")
day_hour_gdf.plot(ax=ax, linewidth=day_hour_gdf['Normalised Value'])
plt.savefig("day{}_hour{}.png".format(dow, hour), dpi = 200, facecolor='#333333')
plt.close()
额外提示:如果您想生成带有背景图块的交互式图形,可以另存为 HTML 或嵌入到 jupyter 笔记本中,请查看 pandas-bokeh。散景的学习曲线可能有点陡峭,但您可以制作非常好的交互式图。
干杯!
我正在尝试创建一周内道路交通的动画地图(通过生成多个绘图),其中道路的粗细度由一天中特定时间的交通量表示。
这就是我正在寻找的东西(但对于每天的每个小时):
数据的结构如下所示:
HMGNS_LNK_ID geometry DOW Hour Normalised Value
2 MULTILINESTRING ((251... 1 0 0.233623
2 MULTILINESTRING ((251... 1 1 0.136391
2 MULTILINESTRING ((251... 1 2 0.108916
DOW
代表 'day of the week'(1 = 星期一),因此对于 7 天中每一天的每个 Hour
,我想根据值绘制道路厚度的地图Normalised Value
.
我在尝试使用此代码循环时遇到问题:
for dow in df['DOW']:
fig, ax = plt.subplots(1)
day_df = df[df['DOW']==dow]
for hour in day_df['Hour']:
day_hour_df = day_df[day_df['Hour']==hour]
day_hour_df.plot(ax=ax, linewidth=day_hour_df['Normalised Value'])
plt.savefig("day{}_hour{}.png".format(dow, hour), dpi = 200, facecolor='#333333')
问题是这些数字只在第 1 天保存,所以直到 day1_hour_23
之后,它又回到 day1_hour0
并用新的东西覆盖情节。我不明白为什么它停在 DOW
2.
我什至不确定数据结构是否正确。我将不胜感激任何帮助。请在我的 repo.
中找到完整代码干杯!
问题出在循环和子集 df
的方式上。让我们详细了解一下循环。第一次在外循环中,dow
将是 1
,而 day_df = df[df['DOW']==dow]
将 select 列 DOW
中具有 1
的所有行。现在,内部循环遍历 selected 行并创建 day1_hour0
到 day1_hour23
。内循环完成,太棒了。
现在我们第二次进入外循环,dow
又是 1
。 day_df = df[df['DOW']==dow]
将 select 列 DOW
中具有 1
的所有行,即上次通过外循环使用的同一组行。因此,它再次(重新)将 day1_hour0
写入 day1_hour23
。
我建议使用 (geo)pandas.groupby:
for dow, day_gdf in df.groupby("DOW"):
for hour, day_hour_gdf in day_gdf.groupby("Hour"):
fig, ax = plt.subplots(1)
print(f"Doing dow={dow}, hour={hour}")
day_hour_gdf.plot(ax=ax, linewidth=day_hour_gdf['Normalised Value'])
plt.savefig("day{}_hour{}.png".format(dow, hour), dpi = 200, facecolor='#333333')
plt.close()
额外提示:如果您想生成带有背景图块的交互式图形,可以另存为 HTML 或嵌入到 jupyter 笔记本中,请查看 pandas-bokeh。散景的学习曲线可能有点陡峭,但您可以制作非常好的交互式图。
干杯!