网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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

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

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

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


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

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


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

00000,US,United States,154505871,140674478,13831393,9,50502,10001000,AL,Alabama,2190519,1993977,196542,9,41427,10001001,AL,Autauga County,25930,23854,2076,8,48863,117.901003,AL,Baldwin County,85407,78491,6916,8.1,50144,12101005,AL,Barbour County,9761,8651,1110,11.4,30117,72.7

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

{"type":"FeatureCollection","features":[ {"type":"Feature","id":"1001","properties":{"name":"Autauga"} {"type":"Feature","id":"1003","properties":{"name":"Baldwin"} {"type":"Feature","id":"1005","properties":{"name":"Barbour"} {"type":"Feature","id":"1007","properties":{"name":"Bibb"} {"type":"Feature","id":"1009","properties":{"name":"Blount"} {"type":"Feature","id":"1011","properties":{"name":"Bullock"} {"type":"Feature","id":"1013","properties":{"name":"Butler"} {"type":"Feature","id":"1015","properties":{"name":"Calhoun"} {"type":"Feature","id":"1017","properties":{"name":"Chambers"} {"type":"Feature","id":"1019","properties":{"name":"Cherokee"}

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

import jsonimport pandas as pd#Map the county codes we have in our geometry to those in the#county_data file, which contains additional rows we don't needwith open(county_geo, 'r') as f: get_id = json.load(f)#Grab the FIPS codes and load them into a dataframecounty_codes = [x['id'] for x in get_id['features']] county_df = pd.DataFrame({'FIPS_Code': county_codes}, dtype=str)#Read into Dataframe, cast to string for consistencydf = pd.read_csv(county_data, na_values=[' ']) df['FIPS_Code'] = df['FIPS_Code'].astype(str)#Perform an inner join, pad NA's with data from nearest countymerged = pd.merge(df, county_df, on='FIPS_Code', how='inner') merged = merged.fillna(method='pad') >>>merged.head() FIPS_Code State Area_name Civilian_labor_force_2011 Employed_2011 \ 0 1001 AL Autauga County 25930 23854 1 1003 AL Baldwin County 85407 78491 2 1005 AL Barbour County 9761 8651 3 1007 AL Bibb County 9216 8303 4 1009 AL Blount County 26347 24156 Unemployed_2011 Unemployment_rate_2011 Median_Household_Income_2011 \0 2076 8.0 48863 1 6916 8.1 50144 2 1110 11.4 30117 3 913 9.9 37347 4 2191 8.3 41940 Med_HH_Income_Percent_of_StateTotal_2011 0 117.9 1 121.0 2 72.7 3 90.2 4 101.2

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

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


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

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


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

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


地图即是我的激情所在——我希望 Vincent 能够更强,包含轻松的添加点、标记及其它的能力。

End

阅读排行榜/精华推荐 1 入门学习

如果有人质疑大数据?不妨把这两个视频转给他

视频:大数据到底是什么 都说干大数据挣钱 1分钟告诉你都在干什么

人人都需要知道 关于大数据最常见的10个问题

2 进阶修炼

从底层到应用,那些数据人的必备技能

如何高效地学好 R?

一个程序员怎样才算精通Python?

3 数据源爬取/收集

排名前50的开源Web爬虫用于数据挖掘

33款可用来抓数据的开源爬虫软件工具

在中国我们如何收集数据?全球数据收集大教程

4 干货教程

PPT:数据可视化,到底该用什么软件来展示数据?

干货|电信运营商数据价值跨行业运营的现状与思考

大数据分析的集中化之路 建设银行大数据应用实践PPT

【实战PPT】看工商银行如何利用大数据洞察客户心声?

六步,让你用Excel做出强大漂亮的数据地图

数据商业的崛起 解密中国大数据第一股——国双

双11剁手幕后的阿里“黑科技” OceanBase/金融云架构/ODPS/dataV

金融行业大数据用户画像实践

“讲述大数据在金融、电信、工业、商业、电子商务、网络游戏、移动互联网等多个领域的应用,以中立、客观、专业、可信赖的态度,多层次、多维度地影响着最广泛的大数据人群


36大数据

长按识别二维码,关注36大数据

搜索「36大数据」或输入36dsj.com查看更多内容。

投稿/商务/合作:dashuju36@qq.com

点击下方 “阅读原文”查看更多

↓↓↓

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
蒯曼4-1长崎美柚,连胜两位日乒队员,晋级女单四强,轰两局11:3

蒯曼4-1长崎美柚,连胜两位日乒队员,晋级女单四强,轰两局11:3

湘楚风云
2026-01-11 00:30:01
果然不出中国所料:日本喊话俄罗斯,72年基业绝不能毁在中国手上

果然不出中国所料:日本喊话俄罗斯,72年基业绝不能毁在中国手上

历史有些冷
2026-01-09 18:50:02
施海荣有魄力,换大量替补出场!郭中楠魏伊衫范泊宁都有出色表现

施海荣有魄力,换大量替补出场!郭中楠魏伊衫范泊宁都有出色表现

金毛爱女排
2026-01-11 00:00:09
陪玩陪睡已过时!拳头塞嘴、集体开嫖、戚薇遭殃,阴暗面彻底曝光

陪玩陪睡已过时!拳头塞嘴、集体开嫖、戚薇遭殃,阴暗面彻底曝光

涵豆说娱
2025-11-20 16:35:46
双丰收,雄鹿战胜湖人后,字母哥收到了一份来自詹姆斯的特别礼物

双丰收,雄鹿战胜湖人后,字母哥收到了一份来自詹姆斯的特别礼物

好火子
2026-01-11 00:44:14
人有没有钱,一看便知:没钱的子女,大多有3大特质、3大穷习惯

人有没有钱,一看便知:没钱的子女,大多有3大特质、3大穷习惯

第一桶金学派
2025-06-30 10:18:46
牡丹花下死,做鬼也风流!37岁“纵欲过度”的王思聪,再陷大丑闻

牡丹花下死,做鬼也风流!37岁“纵欲过度”的王思聪,再陷大丑闻

瓜汁橘长Dr
2025-12-22 15:12:57
哈工大发现:喜欢睡午觉的人,寿命比不睡午觉的人长几年不止?

哈工大发现:喜欢睡午觉的人,寿命比不睡午觉的人长几年不止?

健康之光
2026-01-05 14:22:46
WTT冠军赛四强对阵,三位国乒冠军出局,蒯曼立功,陈幸同压力大

WTT冠军赛四强对阵,三位国乒冠军出局,蒯曼立功,陈幸同压力大

云隐南山
2026-01-11 02:36:52
一举超越美日!中国砸下263亿建全球最大海上机场,到底有多牛?

一举超越美日!中国砸下263亿建全球最大海上机场,到底有多牛?

科学知识点秀
2026-01-10 08:00:04
专家提醒:不要买!不要吃!里面含有硼砂,危害健康,别害了自己

专家提醒:不要买!不要吃!里面含有硼砂,危害健康,别害了自己

蜉蝣说
2025-10-31 10:56:39
四川省城市足球联赛总决赛阶段抽签结果揭晓,首战计划在3月14日打响!

四川省城市足球联赛总决赛阶段抽签结果揭晓,首战计划在3月14日打响!

红星新闻
2026-01-11 00:23:08
1950年,师级首长在成都遭活剥?毛主席拍案而起:116万土匪,一个不留!

1950年,师级首长在成都遭活剥?毛主席拍案而起:116万土匪,一个不留!

寄史言志
2026-01-07 20:37:09
第一次去男友家,我吃了一桌剩菜,偷听母子对话后,我连夜逃离

第一次去男友家,我吃了一桌剩菜,偷听母子对话后,我连夜逃离

云端小院
2026-01-10 10:44:29
特朗普通告全球,不许3国买俄油,话音刚落,中方第一个宣布不服

特朗普通告全球,不许3国买俄油,话音刚落,中方第一个宣布不服

南宗历史
2026-01-10 13:06:24
福建婚礼上新娘颜值爆表走红,新郎长相惹争议:懂事早和董事长?

福建婚礼上新娘颜值爆表走红,新郎长相惹争议:懂事早和董事长?

梅子的小情绪
2025-11-29 14:26:05
伊朗多个城市宣布脱离政府控制,革命卫队军人被打死!

伊朗多个城市宣布脱离政府控制,革命卫队军人被打死!

知兵
2026-01-11 00:07:45
爆笑经典侄女糗事冷笑话,侄女三岁多初上幼儿园不知天高地厚,当老师教育她时她居然说!

爆笑经典侄女糗事冷笑话,侄女三岁多初上幼儿园不知天高地厚,当老师教育她时她居然说!

天天明星
2026-01-10 12:08:36
婆婆把80万全给小叔子,两年后哭着敲门,入赘老公的做法让我意外

婆婆把80万全给小叔子,两年后哭着敲门,入赘老公的做法让我意外

木子言故事
2026-01-04 13:01:59
一生仅存六首诗,却有两首被写进课本,成七绝五绝之最

一生仅存六首诗,却有两首被写进课本,成七绝五绝之最

长风文史
2025-11-26 15:26:24
2026-01-11 03:24:49
36大数据
36大数据
专注大数据和数据可视化
4114文章数 3806关注度
往期回顾 全部

头条要闻

特朗普签署行政令 宣布进入国家紧急状态

头条要闻

特朗普签署行政令 宣布进入国家紧急状态

体育要闻

怒摔水瓶!杜兰特30+12 难阻火箭遭双杀

娱乐要闻

吴速玲曝儿子Joe是恋爱脑

财经要闻

这不算诈骗吗?水滴保诱导扣款惹众怒

科技要闻

必看 | 2026开年最顶格的AI对话

汽车要闻

宝马25年全球销量246.3万台 中国仍是第一大市场

态度原创

本地
手机
艺术
房产
公开课

本地新闻

云游内蒙|“包”你再来?一座在硬核里酿出诗意的城

手机要闻

魅族22Air、22 Next不开售发布,魅族23确认

艺术要闻

601米,150亿美元!沙特目前第一高楼是它!

房产要闻

66万方!4755套!三亚巨量房源正疯狂砸出!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版