为 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_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)
这已在最近的拉取请求中在 folium 中修复:
https://github.com/python-visualization/folium/pull/1005
如果您从 git 安装 folium(或在 0.7 版本发布后从 PyPY 安装),您可以使用 choropleth
方法的 nan_fill_color
和 nan_fill_opacity
参数Map
为没有值的元素设置样式。
本笔记本中的最后一个示例展示了如何做到这一点:
https://nbviewer.jupyter.org/github/python-visualization/folium/blob/master/examples/GeoJSON_and_choropleth.ipynb#Using-choropleth-method
我有一个包含 一些 个国家和变量的数据框,我想使用一个 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_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)
这已在最近的拉取请求中在 folium 中修复: https://github.com/python-visualization/folium/pull/1005
如果您从 git 安装 folium(或在 0.7 版本发布后从 PyPY 安装),您可以使用 choropleth
方法的 nan_fill_color
和 nan_fill_opacity
参数Map
为没有值的元素设置样式。
本笔记本中的最后一个示例展示了如何做到这一点: https://nbviewer.jupyter.org/github/python-visualization/folium/blob/master/examples/GeoJSON_and_choropleth.ipynb#Using-choropleth-method