为什么Python Vincent映射visuzalization不映射数据框架中的数据?

时间:2015-09-18 10:14:59

标签: python vincent

我正在使用Python vincent地图可视化,并使用此包introductory examples。我在ipython notebook工作。

我使用国家/地区FIPS代码(取自here)定义了简单的pandas DataFrame。然后,我尝试使用DataFrame地图通过这些FIPS代码映射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()

enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:3)

它们无法显示,因为您未正确设置map_keyworld_countries.topo.json文件通过3个字母代码标识国家/地区,在该文件中名为id(这对应于page you linked to中名为alpha-3的字段)。如果你看一下the raw data in that json file,你可以看到这一点。

另外,您在'name': 'countries'中设置了geo_data,但在map_key中,您尝试将其引用为counties(请注意缺少的r)。容易犯错,因为它们是映射美国县的示例页面中的counties

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

N.B。 根据您的代码,只会绘制您拥有数据的国家/地区。您可以添加一个包含所有国家/地区轮廓的图层per the second example here,如果您想要所有轮廓,但只有数据颜色的图层。我已在下面的第二个代码/输出部分中对代码进行了更改。

<强> N.B。 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()

输出

Output of script with sample data

带有轮廓图层和数据图层的代码(对于有数据的人来说是彩色的):

#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()

输出(输出层加数据层)

Image with countries outlined - those with data coloured