尝试在Vincent中绘制着色的世界地图(类似于地图数据绑定部分here中的县示例)。我的代码不会抛出错误,但会产生纯色图(即所有国家都是蓝色)。
我有描述每个国家/地区的主题数据(其中国家/地区被标识为iso3代码)。我的数据的玩具版本是:
import pandas as pd
import vincent
import numpy as np
iso3 = ['USA','CHN','BRA']
x = [50,100,150]
data = pd.DataFrame({'iso3': iso3, 'x': x})
我从vincent地图repo中删除了世界国家地图中的id代码,并创建了一个数据框,该数据框将数据中的信息与世界地图json(即iso3代码)中的id代码相匹配:
import json
with open('world-countries.topo.json', 'r') as f:
get_id = json.load(f)
new_geoms = []
for geom in get_id['objects']['world-countries']['geometries']:
new_geoms.append(geom['id'])
amounts = np.zeros((shape(new_geoms)[0]))
j=0
for i in list(new_geoms):
this_data = data[data.iso3==i]
if shape(this_data)[0]>0:
amounts[j] = np.asscalar(this_data['x'])
else:
amounts[j] = 0
j=j+1
map_data = pd.DataFrame({'iso3' : new_geoms, 'x': amounts})
map_data看起来不错,有177个条目(等于世界国家/地区的多边形(国家/地区)数量),x没有NaN&匹配它们应该在哪里,尽管有四个id代码等于-99(这些地方像科索沃没有正式的iso3代码)。最后,我使用Vincent绘制数据:
world_topo = r'world-countries.topo.json'
geo_data = [{'name': 'countries',
'url': world_topo,
'feature': 'world-countries'}]
mapx = vincent.Map(data=map_data, geo_data=geo_data, projection='mercator', scale=150,
data_bind='x', data_key='iso3',
map_key={'world-countries':'geometries.id'}, brew='YlGnBu')
mapx.marks[0].properties.enter.stroke_opacity = vincent.ValueRef(value=.25)
mapx.display()
同样,此代码运行时没有错误,但地图没有基于x值的主题着色。
答案 0 :(得分:0)
需要将它用于map_key:
map_key={'countries':'id'}