为 folium choropleth 中的缺失值设置颜色

Set color for missing values in folium choropleth

我有一个包含 一些 个国家和变量的数据框,我想使用一个 geojson 文件生成一个 folium 的等值线图整个世界。我在 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_functionGeoJson 的解决方法,而不是使用 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)

这已在最近的拉取请求中在 folium 中修复: https://github.com/python-visualization/folium/pull/1005

如果您从 git 安装 folium(或在 0.7 版本发布后从 PyPY 安装),您可以使用 choropleth 方法的 nan_fill_colornan_fill_opacity 参数Map 为没有值的元素设置样式。

本笔记本中的最后一个示例展示了如何做到这一点: https://nbviewer.jupyter.org/github/python-visualization/folium/blob/master/examples/GeoJSON_and_choropleth.ipynb#Using-choropleth-method