等值线图无法为geojson边界渲染着色

问题描述 投票:2回答:2

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

输出我得到enter image description here

我希望Leaflet地图能够根据数据框列数据以每个警察边界着色到适当的级别。 Chorpleth地图与边界完美呈现,但这些都是灰色的,不包含人们期望的色调范围。请find the code, data and the json link here.

csv geo choropleth folium
2个回答
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
投票

问题是密钥的名称和数据库中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。这就是你会得到的

enter image description here

如果您无法理解代码的任何部分,请在下面评论。

© www.soinside.com 2019 - 2024. All rights reserved.