当我开始建造Vincent时, 我的一个目的就是使得地图的建造尽可能合理化. 有一些很棒的python地图库-参见Basemap 和 Kartograph能让地图更有意思. 我强烈推荐这两个工具, 因为他们都很好用而且很强大.

  1. importvincent
  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代码创建可视化地图 10行Python代码创建可视化地图(python绘制地图可视化)  Python 工具 地图 第1张

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

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

  1. vis=vincent.Map(width=1000,height=800)
  2. #AddtheUScountydataandanewlinecolor
  3. vis.geo_data(projection='albersUsa',scale=1000,counties=county_geo)
  4. vis+('2B4ECF','marks',0,'properties','enter','stroke','value')
  5. #Addthestatedata,removethefill,writeVegaspecoutputtoJSON
  6. vis.geo_data(states=state_geo)
  7. vis-('fill','marks',1,'properties','enter')
  8. vis.to_json(path)

10行Python代码创建可视化地图 10行Python代码创建可视化地图(python绘制地图可视化)  Python 工具 地图 第2张

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

  1. #'merged'isthePandasDataFrame
  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代码创建可视化地图 10行Python代码创建可视化地图(python绘制地图可视化)  Python 工具 地图 第3张

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

  1. 00000,US,UnitedStates,154505871,140674478,13831393,9,50502,100
  2. 01000,AL,Alabama,2190519,1993977,196542,9,41427,100
  3. 01001,AL,AutaugaCounty,25930,23854,2076,8,48863,117.9
  4. 01003,AL,BaldwinCounty,85407,78491,6916,8.1,50144,121
  5. 01005,AL,BarbourCounty,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. importjson
  2. importpandasaspd
  3. #Mapthecountycodeswehaveinourgeometrytothoseinthe
  4. #county_datafile,whichcontainsadditionalrowswedon'tneed
  5. withopen(county_geo,'r')asf:
  6. get_id=json.load(f)
  7. #GrabtheFIPScodesandloadthemintoadataframe
  8. county_codes=[x['id']forxinget_id['features']]
  9. county_df=pd.DataFrame({'FIPS_Code':county_codes},dtype=str)
  10. #ReadintoDataframe,casttostringforconsistency
  11. df=pd.read_csv(county_data,na_values=[''])
  12. df['FIPS_Code']=df['FIPS_Code'].astype(str)
  13. #Performaninnerjoin,padNA'swithdatafromnearestcounty
  14. merged=pd.merge(df,county_df,on='FIPS_Code',how='inner')
  15. merged=merged.fillna(method='pad')
  16. >>>merged.head()
  17. FIPS_CodeStateArea_nameCivilian_labor_force_2011Employed_2011\
  18. 01001ALAutaugaCounty2593023854
  19. 11003ALBaldwinCounty8540778491
  20. 21005ALBarbourCounty97618651
  21. 31007ALBibbCounty92168303
  22. 41009ALBlountCounty2634724156
  23. Unemployed_2011Unemployment_rate_2011Median_Household_Income_2011\
  24. 020768.048863
  25. 169168.150144
  26. 2111011.430117
  27. 39139.937347
  28. 421918.341940
  29. Med_HH_Income_Percent_of_StateTotal_2011
  30. 0117.9
  31. 1121.0
  32. 272.7
  33. 390.2
  34. 4101.2

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

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

10行Python代码创建可视化地图 10行Python代码创建可视化地图(python绘制地图可视化)  Python 工具 地图 第4张

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

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

10行Python代码创建可视化地图 10行Python代码创建可视化地图(python绘制地图可视化)  Python 工具 地图 第5张

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

  1. #Swapcountydataforstatedata,resetmap
  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代码创建可视化地图 10行Python代码创建可视化地图(python绘制地图可视化)  Python 工具 地图 第6张

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

转载请说明出处
知优网 » 10行Python代码创建可视化地图(python绘制地图可视化)

发表评论

您需要后才能发表评论