我有一个包含一些国家和变量的数据框,我想使用folium
生成一个Choropleth映射,使用整个世界的geojson文件。我在使用folium
将色标上的最大值分配给我的数据框中不存在的国家时遇到问题。最低要求如下:
import random
import pandas as pd
import folium
import json
map_data = pd.DataFrame({
'A3':['POL', 'CZE', 'SVK', 'HUN', 'AUT'],
'value':random.sample(range(10), 5)
})
m = folium.Map(
location = [50, 15],
zoom_start = 4
)
m.choropleth(
geo_data = 'https://github.com/simonepri/geo-maps/releases/download/v0.6.0/countries-land-10km.geo.json',
data = map_data,
columns = ['A3', 'value'],
key_on = 'feature.properties.A3',
fill_color = 'YlOrRd'
)
我的问题如下:我如何告诉
folium
到为缺少的国家/地区分配特定颜色(例如,灰色或透明)(即,存在于json文件中但未出现在map_data
中的国家),而不是将它们着色为最大值给定变量(这是一个奇怪的行为)? 最佳答案
似乎无法通过choropleth
方法来实现。我找到了使用自定义style_function
和GeoJson
而不是使用choropleth
的解决方法:
import random
import pandas as pd
import folium
from branca.colormap import LinearColormap
import json
map_data = pd.DataFrame({
'A3':['POL', 'CZE', 'SVK', 'HUN', 'AUT'],
'value':random.sample(range(10), 5)
})
map_dict = map_data.set_index('A3')['value'].to_dict()
color_scale = LinearColormap(['yellow','red'], vmin = min(map_dict.values()), vmax = max(map_dict.values()))
def get_color(feature):
value = map_dict.get(feature['properties']['A3'])
if value is None:
return '#8c8c8c' # MISSING -> gray
else:
return color_scale(value)
m = folium.Map(
location = [50, 15],
zoom_start = 4
)
folium.GeoJson(
data = 'https://github.com/simonepri/geo-maps/releases/download/v0.6.0/countries-land-10km.geo.json',
style_function = lambda feature: {
'fillColor': get_color(feature),
'fillOpacity': 0.7,
'color' : 'black',
'weight' : 1,
}
).add_to(m)