Folium使用警察力边界渲染等值线图,但这些都是灰色的,并且与数据框中的数据不匹配。
我还确保遵循新版本的文件,即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
我希望Leaflet地图能够根据数据框列数据以每个警察边界着色到适当的级别。 Chorpleth地图与边界完美呈现,但这些都是灰色的,不包含人们期望的色调范围。请find the code, data and the json link here.
问题是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文件中的名称匹配。
问题是密钥的名称和数据库中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个数据被忽略了通过folium。这就是你会得到的
如果您无法理解代码的任何部分,请在下面评论。