pandas 设置叶分区体积图中缺失值的颜色

dffbzjpn  于 2022-12-21  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个包含 * 一些 * 国家和变量的数据框,我想用folium制作一个地区分布图,使用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中的国家)分配一个特定的颜色(例如,灰色或透明),而不是将它们着色为给定变量的最大值(这是一个奇怪的行为)?

wpx232ag

wpx232ag1#

这是在folium 0.7.0中添加的,您可以使用Mapchoropleth方法的nan_fill_colornan_fill_opacity参数来设置没有值的元素的样式。
本“笔记本”中的最后一个示例说明了如何执行此操作:https://nbviewer.jupyter.org/github/python-visualization/folium/blob/main/examples/GeoJSON_and_choropleth.ipynb#Using-choropleth-method

fdx2calv

fdx2calv2#

使用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)

相关问题