Visualizing geospatial data#

Generating maps from data is a nice way to generate additional insight into data and make it instantly accessible and understandable.

Visualizing geospatial data is a powerful tool for gaining insights and understanding patterns in data.

By mapping data onto a geographic space, it is possible to uncover relationships and trends that might otherwise be difficult to discern. Whether tracking the spread of a virus across the globe, identifying traffic jams in a city, or analyzing consumer behaviour across different regions, geospatial visualization can reveal patterns and relationships that might not be immediately apparent from raw data alone.

With advances in technology and data analytics, creating maps and visualizations has become easier and more accessible than ever, making it a valuable tool for researchers, policymakers, and businesses.

How To#

import pandas as pd

df = pd.read_csv("data/housing.csv")
df.head()
longitude latitude housing_median_age total_rooms total_bedrooms population households median_income median_house_value ocean_proximity
0 -122.23 37.88 41.0 880.0 129.0 322.0 126.0 8.3252 452600.0 NEAR BAY
1 -122.22 37.86 21.0 7099.0 1106.0 2401.0 1138.0 8.3014 358500.0 NEAR BAY
2 -122.24 37.85 52.0 1467.0 190.0 496.0 177.0 7.2574 352100.0 NEAR BAY
3 -122.25 37.85 52.0 1274.0 235.0 558.0 219.0 5.6431 341300.0 NEAR BAY
4 -122.25 37.85 52.0 1627.0 280.0 565.0 259.0 3.8462 342200.0 NEAR BAY
import folium
m = folium.Map(location=[df.latitude.mean(), df.longitude.mean()])
m
Make this Notebook Trusted to load map: File -> Trust Notebook
m = folium.Map(location=[df.latitude.mean(), df.longitude.mean()], zoom_start=6)

for i, row in df.sample(15).iterrows():
    folium.Marker([row.latitude, row.longitude], tooltip=row.ocean_proximity).add_to(m)
m
Make this Notebook Trusted to load map: File -> Trust Notebook
from folium import plugins
heatmap = folium.Map(location=[df.latitude.mean(), df.longitude.mean()], zoom_start=6, tiles='Stamen Toner',)

# plot heatmap
heatmap.add_children(folium.plugins.HeatMap(df[['latitude', 'longitude']].values, radius=15))
heatmap
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[5], line 2
      1 from folium import plugins
----> 2 heatmap = folium.Map(location=[df.latitude.mean(), df.longitude.mean()], zoom_start=6, tiles='Stamen Toner',)
      4 # plot heatmap
      5 heatmap.add_children(folium.plugins.HeatMap(df[['latitude', 'longitude']].values, radius=15))

File /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/folium/folium.py:308, in Map.__init__(self, location, width, height, left, top, position, tiles, attr, min_zoom, max_zoom, zoom_start, min_lat, max_lat, min_lon, max_lon, max_bounds, crs, control_scale, prefer_canvas, no_touch, disable_3d, png_enabled, zoom_control, font_size, **kwargs)
    306     self.add_child(tiles)
    307 elif tiles:
--> 308     tile_layer = TileLayer(
    309         tiles=tiles, attr=attr, min_zoom=min_zoom, max_zoom=max_zoom
    310     )
    311     self.add_child(tile_layer, name=tile_layer.tile_name)

File /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/folium/raster_layers.py:140, in TileLayer.__init__(self, tiles, min_zoom, max_zoom, max_native_zoom, attr, detect_retina, name, overlay, control, show, no_wrap, subdomains, tms, opacity, **kwargs)
    138 self.tiles = tiles
    139 if not attr:
--> 140     raise ValueError("Custom tiles must have an attribution.")
    142 self.options = parse_options(
    143     min_zoom=min_zoom,
    144     max_zoom=max_zoom,
   (...)
    152     **kwargs,
    153 )

ValueError: Custom tiles must have an attribution.
folium.Choropleth(
    
)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[6], line 1
----> 1 folium.Choropleth(
      2     
      3 )

TypeError: __init__() missing 1 required positional argument: 'geo_data'

Exercise#

Change the basemap and chose different marker types.

Additional Resources#