Wednesday, July 3, 2024
HomeLanguagesPythonHow to make Choropleth Maps with Labels using Mapbox API

How to make Choropleth Maps with Labels using Mapbox API

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

Nango Kalahttps://www.kala.co.za
Experienced Support Engineer with a demonstrated history of working in the information technology and services industry. Skilled in Microsoft Excel, Customer Service, Microsoft Word, Technical Support, and Microsoft Office. Strong information technology professional with a Microsoft Certificate Solutions Expert (Privet Cloud) focused in Information Technology from Broadband Collage Of Technology.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments