web-dev-qa-db-ja.com

フォリウムコロプレスの欠損値の色を設定する

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'
)

enter image description here

私の質問は次のとおりです。どのようにfolium不足している国に特定の色(たとえば、灰色または透明)を割り当てる(つまり、jsonファイルには存在するがmap_dataには存在しない色)を伝えることができますか)、与えられた変数の最大値として色付けする代わりに(これは奇妙な動作です)?

8
pieca

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)

enter image description here

5
pieca

これは、最近のプルリクエストでfoliumで修正されました: https://github.com/python-visualization/folium/pull/1005

Gitから(または0.7バージョンがリリースされたらPyPYから)フォリウムをインストールする場合、choroplethMapメソッドのnan_fill_colorおよびnan_fill_opacity引数を使用して、値のないスタイル要素。

このノートブックの最後の例は、その方法を示しています。 https://nbviewer.jupyter.org/github/python-visualization/folium/blob/master/examples/GeoJSON_and_choropleth.ipynb#Using-choropleth-method

4
Conengmo