【问题标题】:How to loop to create plots for each hour of day of geospatial data?如何循环为一天中每一小时的地理空间数据创建图?
【发布时间】:2021-02-09 20:21:14
【问题描述】:

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

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

数据的结构如下所示:

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,我想用值 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')

问题是这些数字只保存了第一天,所以直到day1_hour_23 之后,它又回到day1_hour0 并用新的东西覆盖了情节。我不明白为什么它停在DOW 2。

我什至不确定数据结构是否正确。我将不胜感激任何帮助。请在我的repo 中找到完整代码。

干杯!

【问题讨论】:

    标签: python matplotlib gis geospatial geopandas


    【解决方案1】:

    问题在于循环和子集df 的方式。让我们详细了解一下循环。第一次在外循环中,dow 将是1day_df = df[df['DOW']==dow] 将选择列DOW 中所有带有1 的行。现在内部循环遍历选定的行并创建day1_hour0day1_hour23。内循环完成,很棒。

    现在我们第二次进入外循环,dow 又是1day_df = df[df['DOW']==dow] 将在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。散景的学习曲线可能有点陡峭,但您可以制作出非常漂亮的交互式绘图。

    干杯!

    【讨论】:

      猜你喜欢
      • 2020-05-06
      • 2015-01-11
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多