我有一个包含一些国家和变量的数据框,我想使用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'
)

python - 设置颜色以减少叶酸脉络膜中的值-LMLPHP

我的问题如下:我如何告诉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)

python - 设置颜色以减少叶酸脉络膜中的值-LMLPHP

10-06 08:38