someの国と変数を含むデータフレームがあり、世界全体の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
メソッドでそれを実現する方法はないようです。 GeoJson
を使用する代わりに、カスタムstyle_function
および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から(または0.7バージョンがリリースされたらPyPYから)フォリウムをインストールする場合、choropleth
のMap
メソッドのnan_fill_color
およびnan_fill_opacity
引数を使用して、値のないスタイル要素。
このノートブックの最後の例は、その方法を示しています。 https://nbviewer.jupyter.org/github/python-visualization/folium/blob/master/examples/GeoJSON_and_choropleth.ipynb#Using-choropleth-method