Folium用警力边界绘制了Choropleth贴图,但是这些都是灰色的,并且与数据框中的数据颜色不匹配。
我还确保遵循该文档的新版本,即folium.Choropleth。 我还检查了geojson.io中的json,以确保自己是key_on ='feature.properties.pfa16nm'。 检查geojson时,功能拼写为大写,但是当我将其更改为大写时,会出现错误,并且不会渲染任何地图。我还将文件重命名为仅将geojson作为扩展名,但这没有用。
import pandas as pd
import folium
import json
import os
adults_trafficked = pd.read_excel('Adults trafficked.xlsx')
force_boundaries = 'Police_Force_Areas_December_2016_Generalised_Clipped_Boundaries_in_England_and_Wales.geojson.json'
m = folium.Map([52.6333, -1.1333], zoom_start=4)
folium.Choropleth(
geo_data=force_boundaries,
data=adults_trafficked,
columns=['Police_Force', 'Adults_Exploited'],
key_on='feature.properties.pfa16nm',
threshold_scale=[0, 25, 50, 75, 100, 125, 150, 175],
fill_color='BuPu',
legend_name='Trafficked Humans',
).add_to(m)
m
我希望基于数据框列数据,在将每个警察边界都着色为适当级别的情况下,绘制传单地图。 Chorpleth贴图完美地呈现了边界,但是它们都是灰色的,并且不包含人们期望的色调范围。请find the code, data and the json link here.
答案 0 :(得分:1)
问题是excel文件与json文件不匹配。使用时
columns=['Police_Force', 'Adults_Exploited'],
key_on='feature.properties.pfa16nm',
Police_Force应该与您的json文件中的pfa16nm相匹配。
此代码将为您提供json中的pfa16nms
。
import json
policejson = json.load(open('Police_Force_Areas_December_2016_Generalised_Clipped_Boundaries_in_England_and_Wales.geojson.json'))
for x in policejson['features'] :
print (x['properties']['pfa16nm'])
然后,您需要修复Excel文件,并确保Police_Force
列与json文件中的名称匹配。
答案 1 :(得分:1)
问题是密钥的名称与数据库中的Police_Force的名称不匹配。因此,在分析了您的数据以及json文件之后,我对您的数据进行了一些预处理,以使其名称与我们的json文件中的键匹配。
这是您问题的完整解决方案。
# import libraries
import pandas as pd
import folium
import json
import webbrowser
# read data
adults_trafficked = pd.read_excel('Adults trafficked.xlsx')
# Pre processing of data
adults_trafficked['Police_Force'] = adults_trafficked['Police_Force'].replace('Police|Constabulary','', regex=True, ).replace('&','and', regex=True)
adults_trafficked.loc[adults_trafficked['Police_Force'] == "Metropolitan Service",'Police_Force' ] = 'Metropolitan Police'
# remove any trailing or leading white spaces
adults_trafficked['Police_Force'] = adults_trafficked['Police_Force'].str.strip()
# border json file
force_boundaries = 'Police_Force_Areas_December_2016_Generalised_Clipped_Boundaries_in_England_and_Wales.geojson.json'
# choropleth map
m = folium.Map([52.6333, -1.1333], zoom_start=7)
m.choropleth(
geo_data=force_boundaries,
data=adults_trafficked,
columns=['Police_Force', 'Adults_Exploited'],
key_on='feature.properties.pfa16nm',
threshold_scale=[0, 40, 80, 120, 160, 200],
fill_color='BuPu',
legend_name='Trafficked Humans',
)
m.save('map.html')
webbrowser.open('map.html')
请注意,threshold_scale的长度不能超过6。我可以看到您的长度是8。另外,您的json文件中只有44个Police_force数据,而数据集的长度是47。因此这3个数据没有匹配被叶子忽略。 这就是你得到的
如果您在理解代码的任何部分时遇到困难,请在下面发表评论。