Choropleth Map,Bokeh - 根据属性值指定补丁颜色

时间:2016-09-01 09:06:14

标签: geojson bokeh choropleth

这是我第一次尝试构建世界地图并使用GeoJSONDataSource。 我试图根据国家在其属性中的“大陆”值为贴片指定不同的颜色。

是否可以按以下方式执行某些操作:

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

其中colors是以大陆名称为键的字典,'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)

修改

我尝试通过将补丁中的fill_color属性设置为颜色数组来尝试稍微接近这一点:

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

在Jupyter Notebook中运行此代码时,会出现以下错误:

  

添加输出的Javascript错误!错误:尝试检索属性   数组不存在的字段'fill_color'查看您的浏览器Javascript   控制台了解更多详情。

1 个答案:

答案 0 :(得分:1)

我执行此功能是为了将geoJSON与另一个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