2016-09-01 6 views
0

Это моя первая попытка создать карту мира и использовать GeoJSONDataSource. Я пытаюсь присвоить разные цвета патчам, основанным на значении «континента» страны в его свойствах.Choropleth Map, Bokeh - Назначение цветов патчей на основе значений свойств

Можно ли сделать что-то по следующим направлениям:

p.patches(... fill_color= colours['continent']) 

Где цвет представляет собой словарь с именами континента как ключи, и «континент» является значением континента страны в данных в формате JSON.

Это мой текущий код:

from bokeh.plotting import figure, output_file, show 
from bokeh.io import output_notebook 
import numpy as np 
from bokeh.models import GeoJSONDataSource 

with open('data.geojson') as c: 
     countries = (c.read()) 

geo_source = GeoJSONDataSource(geojson=countries)  
colours = {'Europe': 'red', 'Oceania': 'purple', 'Asia': 'blue', 'Africa': 'pink', "South America": 'green', "Antarctica": 'yellow', 'North America': 'orange', "Seven seas (open ocean)": 'red'} 

p = figure(height=450, width=900, lod_threshold=1) 
p.patches(xs='xs', ys='ys', fill_color='blue', source=geo_source) 
p.multi_line(xs='xs', ys='ys', line_color='white', line_width=0.1, source=geo_source) 

show(p) 

EDIT

Я попытался приближаемся это немного по-другому, установив атрибут fill_color заплатки для массива цветов, как так:

a =[colours[c['properties']['continent']] for c in json.loads(countries)['features']] 

При запуске этого кода в ноутбуке Jupyter появляется следующее сообщение об ошибке:

Javascript error adding output! Error: attempted to retrieve property array for nonexistent field 'fill_color' See your browser Javascript console for more details.

ответ

1

Я выполнил эту функцию, чтобы присвоить геоинформации данные, предоставленные в другом JSON.

У моего geoJSON есть международный код для состояний (ISO 3166-2); мои данные присоединяются к нему.

for state in geo['features']: 
    codState = str(state['properties']['ISO_3166-2']) 

    if codState in data.keys(): 
     if data.values() != 0: 
      state['properties']['data'] = data[codState] 
dataJson = json.dumps(geo,ensure_ascii=True) 
return dataJson