I had to solve a similar problem and this is my solution applied to your problem (although with px.choropleth_mapbox
instead of graph_objects which I found confusing for choropleths).
- The data that you link does not (at least not at the time of writing) have the column 'Enero'.
- I do not have the GeoJSON of the counties in Mexico.
- You never define a Dash-app (
app.layout = ...
), while you can probably serve without it and just have fig.show()
as suggested, explicit beats implicit. Thus creating a layout section is better.
- If I understand how it works, if you use GeoPandas you do not have to generate and 'id' or anything like that as you suggest in your own answer.
Anyways, hopefully my solution can serve as a working start for you. I added radio buttons so that you can select what data column to use for color.
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
import plotly.express as px
import geopandas as gpd
print('Loading data...')
gdf = gpd.read_file('https://gist.githubusercontent.com/Tlaloc-Es/5c82834e5e4a9019a91123cb11f598c0/raw/709ce9126861ef7a7c7cc4afd6216a6750d4bbe1/mexico.geojson')
gdf = gdf.to_crs(epsg=4326)
print('Done!')
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div([
html.Div([
dcc.RadioItems(
id='radio-color_on',
options=[{'label': i, 'value': i} for i in ['AREA','PERIMETER']],
value='AREA',
labelStyle={'display': 'inline-block'}
),
],style={'width': '40%', 'display': 'inline-block',}),
html.Div([], style={'width':'100%'}),
html.Div([
dcc.Graph(id="fig")
],style={'width': '100%', 'display': 'inline-block', 'padding': '0 10',},),
])
@app.callback(
Output("fig", "figure"),
[Input("radio-color_on", "value")])
def draw_choropleth(color_on):
fig = px.choropleth_mapbox(gdf,
geojson=gdf.geometry,
locations=gdf.index,
color=color_on,
color_continuous_scale="Viridis",
#range_color=(0, 12),
mapbox_style="carto-positron",
zoom=4,
center = {"lat":gdf.centroid.y.mean(), "lon":gdf.centroid.x.mean()},
opacity=0.5,
)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0},
height=700,
)
return fig
if __name__ == '__main__':
app.run_server(debug=True)
Saving this code to a file "myapp.py" and running it in the terminal as python myapp.py
starts the development served, firing up a web browser, navigating to the url that it uses (it writes it out in the terminal, usually 172.0.0.1:8050) gives you this:
I am running these versions, from the defaults anaconda channel.
- dash 1.19.0
- dash-core-components 1.3.1
- dash-html-components 1.0.1
- dash-renderer 1.1.2
- flask 1.1.2
- geopandas 0.8.1
PS. I actually used the data to ask a question about dash choropleth mapbox selection behavior (Selection behavior in plotly-dash Choropleth mapbox plot). Thanks!