Search code examples
pythondictionaryplotlyregion

Map of a country by regions | scatter_mapbox | plotly


Thanks to Rob Raymond for the previos work. The aim is to represent the regions of a country with scatter_mapbox, I got this situation of the map (Spain is the example):

import requests
import plotly.express as px
import pandas as pd

# get Spain municipal boundaries
res = requests.get(
    "https://raw.githubusercontent.com/codeforgermany/click_that_hood/main/public/data/spain-provinces.geojson"
)

# get some cities in Spain
df = (
    pd.json_normalize(
        requests.get(
            "https://opendata.arcgis.com/datasets/6996f03a1b364dbab4008d99380370ed_0.geojson"
        ).json()["features"]
    )
    .loc[
        lambda d: d["properties.CNTRY_NAME"].eq("Spain"),
        ["properties.CITY_NAME", "geometry.coordinates"],
    ]
    .assign(
        lon=lambda d: d["geometry.coordinates"].apply(lambda v: v[0]),
        lat=lambda d: d["geometry.coordinates"].apply(lambda v: v[1]),
    )
)

# scatter the cities and add layer that shows municiple boundary
px.scatter_mapbox(df, lat="lat", lon="lon", hover_name="properties.CITY_NAME").update_layout(
    mapbox={
        "style": "carto-positron",
        "zoom": 3.5,
        "layers": [
            {
                "source": res.json(),
                "type": "line",
                "color": "green",
                "line": {"width": 1},
            }
        ],
    }
)

map image

How to change cities by regions?


Solution

  • import plotly.express as px
    import numpy as np
    import geopandas as gpd
    
    
    gdf = gpd.read_file(
        "https://raw.githubusercontent.com/codeforgermany/click_that_hood/main/public/data/spain-provinces.geojson",
        crs="epsg:4326",
    )
    # for choropleth...
    gdf["measure"] = np.random.randint(1, 1000, len(gdf))
    
    px.choropleth_mapbox(
        gdf, geojson=gdf["geometry"].__geo_interface__, locations=gdf.index, color="measure", hover_name="name"
    ).update_layout(
        mapbox={
            "style": "carto-positron",
            "center": {
                "lon": sum(gdf.total_bounds[[0, 2]]) / 2,
                "lat": sum(gdf.total_bounds[[1, 3]]) / 2,
            },
            "zoom":4
        },
        margin={"l":0,"r":0,"t":0,"b":0}
    )
    

    enter image description here