Choropleth贴图无法为geojson边界渲染阴影

时间:2019-04-04 14:57:13

标签: csv geo choropleth folium

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

我得到的输出 enter image description here

我希望基于数据框列数据,在将每个警察边界都着色为适当级别的情况下,绘制传单地图。 Chorpleth贴图完美地呈现了边界,但是它们都是灰色的,并且不包含人们期望的色调范围。请find the code, data and the json link here.

2 个答案:

答案 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个数据没有匹配被叶子忽略。 这就是你得到的

enter image description here

如果您在理解代码的任何部分时遇到困难,请在下面发表评论。