如何循环为地理空间数据的每一小时创建图?

问题描述

我正在尝试创建一周内道路交通的动画地图(通过生成多个绘图),其中道路的厚度由一天中特定时间的交通量表示。

这就是我正在寻找的东西(但对于每天的每个小时):

enter image description here

数据的结构如下所示:

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 将是 1day_df = df[df['DOW']==dow] 将选择列 1 中带有 DOW 的所有行。现在内部循环遍历选定的行并创建 day1_hour0day1_hour23。内循环完成,很棒。

现在我们第二次进入外循环,dow 又是 1day_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。散景的学习曲线可能有点陡峭,但您可以制作非常好的交互式绘图。

干杯!