问题描述
我正在尝试创建一周内道路交通的动画地图(通过生成多个绘图),其中道路的厚度由一天中特定时间的交通量表示。
这就是我正在寻找的东西(但对于每天的每个小时):
数据的结构如下所示:
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
代表“星期几”(1 = 星期一),因此对于每 7 天的每 Hour
天我想用值 { 绘制具有道路厚度的地图{1}}。
我在尝试使用此代码循环时遇到问题:
normalised Value
问题是数字只保存了第 1 天,所以直到 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')
和之后,它返回到 day1_hour_23
并用新的东西覆盖情节。我不明白为什么它停在 day1_hour0
2.
我什至不确定数据结构是否正确。我将不胜感激。请在我的 repo 中找到完整代码。
干杯!
解决方法
问题在于循环和子集 df
的方式。让我们详细了解一下这个循环。第一次在外循环中,dow
将是 1
,day_df = df[df['DOW']==dow]
将选择列 1
中带有 DOW
的所有行。现在内部循环遍历选定的行并创建 day1_hour0
到 day1_hour23
。内循环完成,很棒。
现在我们第二次进入外循环,dow
又是 1
。 day_df = df[df['DOW']==dow]
将选择列 1
中带有 DOW
的所有行,即它上次通过外循环使用的同一组行。因此,它再次(重新)将 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。散景的学习曲线可能有点陡峭,但您可以制作非常好的交互式绘图。
干杯!