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) 

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

当我开始建造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) 

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

加之,等值线地图需绑定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) 

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

我们的数据并非没有争议无需改造——用户需要确保 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) 

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

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


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

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

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


  
  
  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) 

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

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


本文作者:renwofei423

来源:51CTO

相关文章
|
1月前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
49 6
|
23天前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
62 33
|
24天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
44 10
|
1月前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
86 8
|
1月前
|
数据可视化 编译器 Python
Manim:数学可视化的强大工具 | python小知识
Manim(Manim Community Edition)是由3Blue1Brown的Grant Sanderson开发的数学动画引擎,专为数学和科学可视化设计。它结合了Python的灵活性与LaTeX的精确性,支持多领域的内容展示,能生成清晰、精确的数学动画,广泛应用于教育视频制作。安装简单,入门容易,适合教育工作者和编程爱好者使用。
420 7
|
1月前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
64 11
|
1月前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
50 11
|
1月前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
1月前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
63 6
|
1月前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。

热门文章

最新文章