How to make Choropleth Maps with Labels using Mapbox API
Last Updated :
04 Sep, 2022
Choropleth maps are interesting visualization tools that use the intensity of a color to represent aggregate data for different locations within their bounding boxes. They are a lot of fun and are fairly easy to make using the Plotly library. Choropleth maps are powerful data visual representations of data. Let’s get started with a step-by-step guide:
Set Up Your Mapbox Account
- Go to https://www.mapbox.com/ and click on sign up.
- Verify your e-mail address.
- Now, click on “tokens” in the navbar.
- Copy your Default Public Token and paste it into your notepad.
Fig. 2 Mapbox account after logging in.
Find an Appropriate GeoJson File for Your Map
If you perform a simple google search typing “{desired map} geojson file”, chances are, that you’ll find the GeoJson file you’re looking for. In this case, we are using the GeoJson file of the Indian State-Wise Map. (you can find it here).
Picking a Suitable Dataset
For this example, we’re using the Indian map and our aim is to divide the map into its state-wise components. For the aforementioned reasons, we’ll have to pick a dataset such that it has a value corresponding to each of India’s states and union territories. Hence, we’ve created a CSV File of data pertaining to Alcohol Consumption Percentage Per State in India. (you can find the dataset on https://www.findeasy.in/alcohol-consumption-in-india/ or you can simply download the CSV file from here).
Fig. 3 CSV file of the appropriate dataset
Step 1:
Import these libraries, necessary to make our code work:
Python3
from urllib.request import urlopen
import json
import pandas as pd
from shapely.geometry import shape
import plotly.graph_objects as go
import plotly.express as px
|
Step 2:
Now load your geojson file using json.load().
Python3
with urlopen(url) as response:
body = response.read()
geo_json = json.loads(body)
|
Output:
{‘type’: ‘FeatureCollection’,
‘features’: [{‘type’: ‘Feature’,
‘geometry’: {‘type’: ‘Polygon’,
‘coordinates’: [[[95.23391968067268, 26.68245856965871],
[95.23282005383173, 26.705791937482644],
[95.21038086477148, 26.73124215303452],…
Step 3:
Pass the data from your CSV file to a Pandas’s Dataframe.
Python3
df = pd.read_csv( "D:\Documents\india_alcohol_stats.csv" )
df.head()
|
Output:
state consumption
0 Andaman & Nicobar 25.4
1 Andhra Pradesh 13.7
2 Arunachal Pradesh 28.0
3 Assam 8.8
4 Bihar 7.9
Step 4:
Place your dataset in your geojson file.
Note: In place of “ST_NM”, you can write the name of the equivalent field by looking at your geojson file.
Python3
center_pos = {}
features = geo_json[ 'features' ]
for feature in features:
k = feature[ 'properties' ][ 'ST_NM' ]
s = shape(feature[ "geometry" ])
p = s.centroid
center_pos[k] = list (p.coords)
|
Step 5:
Save your MAPBOX token in a variable.
Python3
mapbox_access_token = "{YOUR_TOKEN_KEY_HERE}"
|
Step 6:
Add this code snippet to customize what your labels will look like. Customize the “val” fields in accordance with your CSV file.
Note: In the above code, we have chosen all the labels above the 26% mark to be of white color and the rest in black because darker color labels go with light colored background and so on.
Python3
fig = go.Figure()
for k,v in center_pos.items():
val = df[df[ 'state' ] = = k][ 'consumption' ]
try :
if float ( format (val.values[ 0 ]))> 26.0 :
colour = 'white'
else :
colour = 'black'
val = format (val.values[ 0 ]) + '%'
except IndexError:
val = '{:1}' . format ( 1 )
fig.add_trace(go.Scattermapbox(
lat = [center_pos[k][ 0 ][ 1 ]],
lon = [center_pos[k][ 0 ][ 0 ]],
mode = 'text' ,
textfont = dict (
color = colour,
size = 12 ,
),
text = val,
showlegend = False
))
|
Step 7:
Finally, add the following code which will help us display our data on the map. For your map, you can choose one of these colorscales.
Python3
fig.add_trace(go.Choroplethmapbox(
geojson = geo_json,
locations = df[ 'state' ],
featureidkey = "properties.ST_NM" ,
z = df[ 'consumption' ],
colorscale = "Blues" ,
marker_opacity = 0.7 ,
marker_line_width = 0
))
fig.update_layout(
mapbox_accesstoken = mapbox_access_token,
mapbox_zoom = 4 ,
mapbox_center = { "lat" : 22.5 , "lon" : 81.0 }
)
fig.update_layout(autosize = False ,
height = 600 ,
width = 800 ,
margin = { "r" : 0 , "t" : 0 , "l" : 0 , "b" : 0 },
)
fig.show()
|
Step 5: Download Your Map
If you find any white-colored state (i.e. 0% in the label), consider checking your CSV file again for the correct state name and data. you can download the map by right-clicking on the camera icon on the top right of the map.
Fig. 1 Transposing data on a map with labels using Mapbox
Share your thoughts in the comments
Please Login to comment...