Search code examples
pythonleafletgisgeopandasfolium

Display date, id column and other columns in Folium HeatMapWithTime


I have a taxi frequency dataset like this:

ID   Date         Latitude   Longitude   Sample_Mean
01   2019-10-09   40.431753  -3.711294   0.1
03   2019-10-21   40.431753  -3.711294   0.05
32   2020-03-22   40.458772  -3.699815   0.2
44   2020-03-29   40.431753  -3.711294   0.22

I am trying to create a heat map with time using folium to display the volume of taxi's on different days. I'm trying to do the following:

  1. How to display the 'Date' as an index on the animation? please see image
  2. How to display the 'ID' on each heat map spot?
  3. How to display the 'Sample_Mean' on each heat map spot?

This is what I have tried:

# Make basemap
map = folium.Map(location=[25.41, -3.703], zoom_start=15, tiles='CartoDB positron')
df['date'] = df['date'].sort_values(ascending=True)
data = []
for _, d in df.groupby('date'):
    data.append([[row['latitude'], row['longitude'], row['Sample_Mean']] for _, row in d.iterrows()])

hm = plugins.HeatMapWithTime(data, auto_play=True,display_index=True,max_opacity=0.8)
hm.add_to(map)

Solution

  • The only thing that can be done with the heatmap animation in folium is to display the index as a date. As far as I know, it is not possible to display or annotate any other value. Instead, you can set the color distinction by threshold and the size of the circle radius. Here is an example. See also the official sample.

    import pandas as pd
    import numpy as np
    import io
    
    data = '''
    ID   date         latitude   longitude   Sample_Mean
    01   2019-10-09   40.431753  -3.711294   0.1
    03   2019-10-21   40.431753  -3.711294   0.2
    04   2019-10-30   40.431753  -3.711294   0.8
    32   2020-03-22   40.458772  -3.699815   0.4
    44   2020-03-29   40.458772  -3.699815   0.66
    45   2020-04-07   40.458772  -3.699815   0.95
    
    '''
    
    df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
    df['date'] = df['date'].sort_values(ascending=True)
    data = []
    
    for _, d in df.groupby('date'):
        data.append([[row['latitude'], row['longitude'], row['Sample_Mean']] for _, row in d.iterrows()])
    
    import folium
    import folium.plugins as plugins
    
    m = folium.Map(location=[40.43, -3.703], zoom_start=13, tiles='CartoDB positron')
    hm = plugins.HeatMapWithTime(data, auto_play=True,
                                 display_index=True,
                                 gradient={0.2: 'blue', 0.4: 'lime', 0.6: 'orange', 1: 'red'},
                                 index=df['date'].tolist(),
                                 max_opacity=0.8)
    hm.add_to(m)
    
    m
    

    enter image description here