Open In App

How to make Choropleth Maps with Labels using Mapbox API

Last Updated : 04 Sep, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

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.
make Choropleth Maps with Labels using Mapbox API

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




# 56c13bbbf9d97d187fea01ca62ea5112/raw/
# e388c4cae20aa53cb5090210a42ebb9b765c0a36/india_states.geojson"
with urlopen(url) as response:
    body = response.read()
geo_json = json.loads(body)
# geo_json


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




# Paste the file path of your CSV file here
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




# paste you token that you copied from mapbox
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():
    #print(k,v)
    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_style="carto-positron",
    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.

How to make Choropleth Maps

Fig. 1 Transposing data on a map with labels using Mapbox



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads