2

我正在使用Python vincent这个包介绍性示例来使用地图可视化。我在ipython notebook.

我用国家 FIPS 代码定义简单pandas DataFrame(取自此处)。然后我尝试通过这些 FIPS 代码DataFrame用地图映射数据,但结果可视化无法以任何方式为国家着色。我怎样才能让它工作?vincent

country_data_tmp = pd.DataFrame({'country_names' : np.array(['Argentina', 'Armenia', 'Australia', 'Austria']),
                                 'country_FIPS' : np.array(['032', '051', '036', '040']),
                                 'my_rate' : np.array([0.254, 0.3456, 0.26, 0.357])})
country_data_tmp.head()

在此处输入图像描述

world_topo = r'world-countries.topo.json'

geo_data = [{'name': 'countries',
             'url': world_topo,
             'feature': 'world-countries'}]

vis = vincent.Map(data=country_data_tmp, 
                  geo_data=geo_data, 
                  scale=1100, 
                  data_bind='my_rate', 
                  data_key='country_FIPS',
                  map_key={'counties': 'properties.FIPS'})

vis.display()

在此处输入图像描述

4

1 回答 1

3

它们不显示是因为您没有map_key正确设置。该world_countries.topo.json文件通过在该文件中命名的 3 个字母代码标识国家/id地区(这对应于您链接到alpha-3的页面中调用的字段)。如果您查看该 json 文件中的原始数据,您可以看到这一点。

此外,您设置'name': 'countries'geo_data,但map_key您尝试将其引用为counties(注意缺少r)。很容易犯错误,因为它counties在他们绘制美国县的示例页面中。

如果您更改变量名称以便它们引用非空字段 - 您将获得一个可爱的地图,因为country_alpha3您的数据表匹配idJSON 变量countries

注意正如您的代码所代表的那样,只会绘制您拥有数据的国家/地区。如果您想要所有的轮廓,您可以按照这里的第二个示例添加一个包含所有国家轮廓的图层,但只有那些带有彩色数据的图层。我在下面的第二个代码/输出部分中提供了对代码的更改。

NB 2与您当前的颜色对比值my_rate不是很明显。尝试一下[0,0.3,0.7,1.0]以说服自己它正在以不同的方式着色它们。

代码

#Data setup bit - Input[1] from your notebook
#Note new name for country code country_alpha3

import pandas as pd
import numpy as np

country_data_tmp = pd.DataFrame({'country_names' : np.array(['Argentina', 'Armenia', 'Australia', 'Austria']),
                                 'country_alpha3' : np.array(['ARG','ARM','AUS','AUT']),
                                 'my_rate' : np.array([0.254, 0.3456, 0.26, 0.357])})
country_data_tmp.head()

#map drawing bit Input[2] from your notebook
#Note the changes in variable names

world_topo = r'world-countries.topo.json'

geo_data = [{'name': 'countries',
             'url': world_topo,
             'feature': 'world-countries'}]

vis = vincent.Map(data=country_data_tmp, 
                  geo_data=geo_data, 
                  scale=1100, 
                  data_bind='my_rate', 
                  data_key='country_alpha3',
                  map_key={'countries': 'id'})

vis.display()

输出

带有样本数据的脚本输出

带有轮廓层和数据层的代码(带有数据的颜色):

#Replace input[2] with this to add a layer with outline only

world_topo = r'world-countries.topo.json'

geo_data = [{'name': 'countries',
             'url': world_topo,
             'feature': 'world-countries'},
           {'name': 'countries_outline',
             'url': world_topo,
             'feature': 'world-countries'}]

vis = vincent.Map(data=country_data_tmp, 
                  geo_data=geo_data, 
                  scale=100, 
                  data_bind='my_rate', 
                  data_key='country_alpha3',
                  map_key={'countries': 'id'})

del vis.marks[1].properties.update
vis.marks[1].properties.enter.stroke.value = '#000'

vis.display()

输出(输出层加数据层)

带有国家轮廓的图像 - 带有彩色数据的图像

于 2015-09-23T20:47:56.093 回答