I have the following code which plots an empty map. It should plot all the different values on the different neighborhoods. The CSV-file used: Share/neighborhood_criminality.csv at main · RobertKiers/Share · GitHub
import plotly.graph_objects as go
import pandas as pd
import numpy as np
from urllib import request
import json
total_data = pd.read_csv('neighborhood_criminality.csv', delimiter=';')
def make_map(df, xcol, ycol):
# Open geojson
url='https://cartomap.github.io/nl/wgs84/buurt_2022.geojson'
with request.urlopen(url) as f:
jdata = json.load(f)
# Define layout
layout = go.Layout(
margin={'l': 0, 'r': 0, 't': 0, 'b': 0},
mapbox={
'style': 'carto-positron',
'center': {'lon': 5.7970, 'lat': 52.1500},
'zoom': 6
}
)
# Create figure
fig = go.Figure(layout=layout)
# Add choropleth trace
fig.add_trace(go.Choroplethmapbox(
geojson=jdata,
locations = df[df.columns[0]].tolist(),
z=df[ycol],
colorscale='IceFire',
colorbar=dict(
title=ycol
),
marker_opacity=0.7,
marker_line_width=0.5,
featureidkey='properties.statcode',
hoverinfo= "location + z",
customdata = np.stack((df[xcol], df[ycol]), axis=-1),
hovertemplate = ('<br><b>Neighborhood</b>: %{customdata[0]}<br>'+\
'<b>Value</b>: %{z}<br>')
))
# Update geos
fig.update_geos(fitbounds="locations", visible=False)
# Show figure
fig.show()
make_map(total_data, 'neighborhood_code', 'total_destruction')
Since we are specifying the municipality code as the location, I think we need to associate it with the statcode of the geojson property. So we need to specify ‘properties.statcode’ as the key to associate. I am commenting on a guess since no sample data is presented, so please replace it with your actual data. I have created sample data and created a map.
from urllib import request
import json
import plotly.graph_objects as go
import numpy as np
import pandas as pd
codes, names, values = [],[],[]
for i in range(len(jdata['features'])):
stat_code = jdata['features'][i]['properties']['statcode']
stat_name = jdata['features'][i]['properties']['statnaam']
codes.append(stat_code)
names.append(stat_name)
values.append(np.random.randint(1000,10000))
df = pd.DataFrame({'statcode': codes, 'statnaam': names, 'value': values})
def maak_map(df, xcol, ycol):
url='https://cartomap.github.io/nl/wgs84/gemeente_2022.geojson'
with request.urlopen(url) as f:
jdata = json.load(f)
# Define layout
layout = go.Layout(
margin={'l': 0, 'r': 0, 't': 0, 'b': 0},
mapbox={
'style': 'carto-positron',
'center': {'lon': 5.7970, 'lat': 52.1500},
'zoom': 6
}
)
# Create figure
fig = go.Figure(layout=layout)
# Add choropleth trace
fig.add_trace(go.Choroplethmapbox(
geojson=jdata,
locations = df[df.columns[0]].tolist(),
z=df[ycol],
colorscale='IceFire',
colorbar=dict(
title=ycol
),
marker_opacity=0.7,
marker_line_width=0.01,
featureidkey='properties.statcode',
hoverinfo= "location + z",
customdata = np.stack((df[xcol], df[ycol]), axis=-1),
hovertemplate = ('<br><b>Gemeente</b>: %{customdata[0]}<br>'+\
'<b>Waarde</b>: %{z}<br>')
))
# Update geos
fig.update_geos(fitbounds="locations", visible=False)
# Show figure
fig.show()
maak_map(df,'statcode','value')
1 Like
Hi. Thank you for the response. I couldn’t get it to work. I have updated my question with the CSV-file. Can you give any further help?
I have tried running it with the sample data provided and the modified geojson file, and it does indeed produce an error. First of all, the number of users does not match the number of geojson, I did not trace the javascript so I do not know the details, but I do not know if the error is caused by a mismatch between the number of user data and the number of geojson. There may also be a problem with the number of data. If you try to match the region code and geojson count as in my answer, and limit the data to total_data[:500], etc., it will show up.