10行Python代码创建可视化地图


  1. import vincent 
  2. world_countries = r'world-countries.json' 
  3. world = vincent.Map(width=1200, height=1000) 
  4. world.geo_data(projection='winkel3', scale=200, world=world_countries) 
  5. world.to_json(path) 

 

当我开始建造Vincent时, 我的一个目的就是使得地图的建造尽可能合理化. 有一些很棒的python地图库-参见Basemap 和 Kartograph能让地图更有意思. 我强烈推荐这两个工具, 因为他们都很好用而且很强大. 我想有更简单一些的工具,能依靠Vega的力量并且允许简单的语法点到geoJSON文件,详细描述一个投影和大小/比列,最后输出地图.

例如, 将地图数据分层来建立更复杂的地图:


  1. vis = vincent.Map(width=1000, height=800) 
  2. #Add the US county data and a new line color 
  3. vis.geo_data(projection='albersUsa', scale=1000, counties=county_geo) 
  4. vis + ('2B4ECF', 'marks', 0, 'properties', 'enter', 'stroke', 'value') 
  5.  
  6. #Add the state data, remove the fill, write Vega spec output to JSON 
  7. vis.geo_data(states=state_geo) 
  8. vis - ('fill', 'marks', 1, 'properties', 'enter') 
  9. vis.to_json(path) 

加之,等值线地图需绑定Pandas数据,需要数据列直接映射到地图要素.假设有一个从geoJSON到列数据的1:1映射,它的语法是非常简单的:


  1. #'merged' is the Pandas DataFrame 
  2. vis = vincent.Map(width=1000, height=800) 
  3. vis.tabular_data(merged, columns=['FIPS_Code', 'Unemployment_rate_2011'])  
  4. vis.geo_data(projection='albersUsa', scale=1000, bind_data='data.id', counties=county_geo) 
  5. vis + (["#f5f5f5","#000045"], 'scales', 0, 'range') 
  6. vis.to_json(path) 

我们的数据并非没有争议无需改造——用户需要确保 geoJSON 键与熊猫数据框架之间具有1:1的映射。下面就是之前实例所需的简明的数据框架映射:我们的国家信息是一个列有FIPS 码、国家名称、以及经济信息(列名省略)的 CSV 文件:


  1. 00000,US,United States,154505871,140674478,13831393,9,50502,100 
  2. 01000,AL,Alabama,2190519,1993977,196542,9,41427,100 
  3. 01001,AL,Autauga County,25930,23854,2076,8,48863,117.9 
  4. 01003,AL,Baldwin County,85407,78491,6916,8.1,50144,121 
  5. 01005,AL,Barbour County,9761,8651,1110,11.4,30117,72.7 

在 geoJSON 中,我们的国家形状是以 FIPS 码为id 的(感谢 fork 自 Trifacta 的相关信息)。为了简便,实际形状已经做了简略,在示例数据可以找到完整的数据集:


  1. {"type":"FeatureCollection","features":[ 
  2. {"type":"Feature","id":"1001","properties":{"name":"Autauga"} 
  3. {"type":"Feature","id":"1003","properties":{"name":"Baldwin"} 
  4. {"type":"Feature","id":"1005","properties":{"name":"Barbour"} 
  5. {"type":"Feature","id":"1007","properties":{"name":"Bibb"} 
  6. {"type":"Feature","id":"1009","properties":{"name":"Blount"} 
  7. {"type":"Feature","id":"1011","properties":{"name":"Bullock"} 
  8. {"type":"Feature","id":"1013","properties":{"name":"Butler"} 
  9. {"type":"Feature","id":"1015","properties":{"name":"Calhoun"} 
  10. {"type":"Feature","id":"1017","properties":{"name":"Chambers"} 
  11. {"type":"Feature","id":"1019","properties":{"name":"Cherokee"} 

我们需要匹配 FIPS 码,确保匹配正确,否则 Vega 无法正确的压缩数据:


  1. import json 
  2. import pandas as pd 
  3. #Map the county codes we have in our geometry to those in the 
  4. #county_data file, which contains additional rows we don't need 
  5. with open(county_geo, 'r') as f: 
  6.     get_id = json.load(f) 
  7.  
  8. #Grab the FIPS codes and load them into a dataframe 
  9. county_codes = [x['id'] for x in get_id['features']] 
  10. county_df = pd.DataFrame({'FIPS_Code': county_codes}, dtype=str) 
  11.  
  12. #Read into Dataframe, cast to string for consistency 
  13. df = pd.read_csv(county_data, na_values=[' ']) 
  14. df['FIPS_Code'] = df['FIPS_Code'].astype(str) 
  15.  
  16. #Perform an inner join, pad NA's with data from nearest county 
  17. merged = pd.merge(df, county_df, on='FIPS_Code', how='inner') 
  18. merged = merged.fillna(method='pad') 
  19.  
  20. >>>merged.head() 
  21.       FIPS_Code State       Area_name  Civilian_labor_force_2011  Employed_2011  \ 
  22.     0      1001    AL  Autauga County                      25930          23854    
  23.     1      1003    AL  Baldwin County                      85407          78491    
  24.     2      1005    AL  Barbour County                       9761           8651    
  25.     3      1007    AL     Bibb County                       9216           8303    
  26.     4      1009    AL   Blount County                      26347          24156 
  27.  
  28.    Unemployed_2011  Unemployment_rate_2011  Median_Household_Income_2011  \ 
  29. 0             2076                     8.0                         48863    
  30. 1             6916                     8.1                         50144    
  31. 2             1110                    11.4                         30117    
  32. 3              913                     9.9                         37347    
  33. 4             2191                     8.3                         41940 
  34.  
  35.    Med_HH_Income_Percent_of_StateTotal_2011   
  36. 0                                     117.9   
  37. 1                                     121.0   
  38. 2                                      72.7   
  39. 3                                      90.2   
  40. 4                                     101.2 

现在,我们可以快速生成不同的等值线:


  1. vis.tabular_data(merged, columns=['FIPS_Code', 'Civilian_labor_force_2011'])  
  2. vis.to_json(path) 

这只能告诉我们 LA 和 King 面积非常大,人口非常稠密。让我们再看看中等家庭收入:


  1. vis.tabular_data(merged, columns=['FIPS_Code', 'Median_Household_Income_2011']) 
  2. vis.to_json(path) 

明显很多高收入区域在东海岸或是其他高密度区域。我敢打赌,在城市层级这将更加有趣,但这需要等以后发布的版本。让我们快速重置地图,再看看国家失业率:


  1. #Swap county data for state data, reset map 
  2. state_data = pd.read_csv(state_unemployment) 
  3. vis.tabular_data(state_data, columns=['State', 'Unemployment']) 
  4. vis.geo_data(bind_data='data.id', reset=True, states=state_geo) 
  5. vis.update_map(scale=1000, projection='albersUsa') 
  6. vis + (['#c9cedb', '#0b0d11'], 'scales', 0, 'range') 
  7. vis.to_json(path) 

地图即是我的激情所在——我希望 Vincent 能够更强,包含轻松的添加点、标记及其它的能力。如果各位读者对于映射方面有什么功能上的需求,可以在Github上给我发问题。 

本文作者:renwofei423

来源:51CTO

时间: 2024-09-08 07:49:32

10行Python代码创建可视化地图的相关文章

一篇文章教你用 11 行 Python 代码实现神经网络

声明:本文是根据英文教程 A Neural Network in 11 lines of Python(用 11 行 Python 代码实现的神经网络)学习总结而来,关于更详细的神经网络的介绍可以参考我的另一篇博客:从感知机到人工神经网络. 如果你读懂了下面的文章,你会对神经网络有更深刻的认识,有任何问题,请多指教.   Very simple Neural Network 首先确定我们要实现的任务: 输出的为样本为 X 为 4*3,有 4 个样本 3 个属性,每一个样本对于这一个真实值 y,为

仅用500行Python代码实现一个英文解析器的教程_python

语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理.自然语言引入了很多意外的歧义,以我们对世界的了解可以迅速地发现这些歧义.举一个我很喜欢的例子: 正确的解析是连接"with"和"pizza",而错误的解析将"with"和"eat"联系在了一起: 过去的一些年,自然语言处理(NLP)社区在语法分析方面取得了很大的进展.现在,小小的 Python 实现可能比广泛应用的 Stanford 解析器表现得更出色. 文章剩下

50行Python代码制作一个计算器

简介 在这篇文章中,我将向大家演示怎样向一个通用计算器一样解析并计算一个四则运算表达式.当我们结束的时候,我们将得到一个可以处理诸如 1+2*-(-3+2)/5.6+3样式的表达式的计算器了.当然,你也可以将它拓展的更为强大. 我本意是想提供一个简单有趣的课程来讲解 语法分析 和 正规语法(编译原理内容).同时,介绍一下 PlyPlus,这是一个我断断续续改进了好几年的语法解析 接口.作为这个课程的附加产物,我们最后会得到完全可替代eval()的一个安全的四则运算器. 如果你想在自家的电脑上试试

25 行 Python 代码实现人脸检测——OpenCV 技术教程

OpenCV OpenCV 是最流行的计算机视觉库,原本用 C 和 C++ 开发,现在也支持 Python. 它使用机器学习算法在图像中搜索人的面部.对于人脸这么复杂的东西,并没有一个简单的检测能对是否存在人脸下结论,而需要成千上万的特征匹配.算法把人脸识别任务分解成数千个小任务,每个都不难处理.这些任务也被称为分类器. 对于类似于人脸的对象,你或许需要不少于 6000 个分类器,每一个都需要成功匹配(当然,有容错率),才能检测出人脸.但这有一个问题:对于人脸识别,算法从左上角开始计算一个个数据

仅用50行Python代码实现一个简单的代理服务器_python

之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B. 本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限.于是就自己用python写一个.   原理很简单. 1.开一个socket server监听连接请求 2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求.即client->proxy->forward.proxy既是socket服务端

使用70行Python代码实现一个递归下降解析器的教程_python

 第一步:标记化 处理表达式的第一步就是将其转化为包含一个个独立符号的列表.这一步很简单,且不是本文的重点,因此在此处我省略了很多. 首先,我定义了一些标记(数字不在此中,它们是默认的标记)和一个标记类型:   token_map = {'+':'ADD', '-':'ADD', '*':'MUL', '/':'MUL', '(':'LPAR', ')':'RPAR'} Token = namedtuple('Token', ['name', 'value']) 下面就是我用来标记 `expr`

仅利用30行Python代码来展示X算法_python

假如你对数独解法感兴趣,你可能听说过精确覆盖问题.给定全集 X 和 X 的子集的集合 Y ,存在一个 Y 的子集 Y*,使得 Y* 构成 X 的一种分割. 这儿有个Python写的例子.   X = {1, 2, 3, 4, 5, 6, 7} Y = { 'A': [1, 4, 7], 'B': [1, 4], 'C': [4, 5, 7], 'D': [3, 5, 6], 'E': [2, 3, 6, 7], 'F': [2, 7]} 这个例子的唯一解是['B', 'D', 'F']. 精确覆

3行Python代码完成人脸识别

Face Recognition软件包 这是世界上最简单的人脸识别库了.你可以通过Python引用或者命令行的形式使用它,来管理和识别人脸. 该软件包使用dlib中最先进的人脸识别深度学习算法,使得识别准确率在<Labled Faces in the world>测试基准下达到了99.38%. 它同时提供了一个叫face_recognition的命令行工具,以便你可以用命令行对一个文件夹中的图片进行识别操作. 特性 在图片中识别人脸 找到图片中所有的人脸 找到并操作图片中的脸部特征 获得图片中

400多行Python代码实现了一个FTP服务器_python

Python版本 实现了比之前的xxftp更多更完善的功能 1.继续支持多用户 2.继续支持虚拟目录 3.增加支持用户根目录以及映射虚拟目录的权限设置 4.增加支持限制用户根目录或者虚拟目录的空间大小 xxftp的特点 1.开源.跨平台 2.简单.易用 3.不需要数据库 4.可扩展性超强 5.你可以免费使用xxftp假设自己的私人FTP服务器 测试地址 ftp://xiaoxia.org 匿名帐号可以使用! 匿名根目录只读,映射了一个虚拟目录,可以上传文件但不允许更改! 使用方法 跟之前用C语言