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

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_hour0day1_hour23。内循环完成,太棒了。

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

干杯!