使用Python制作3个简易地图

作者 | Ritvik Kharkar

来源 | Medium

编辑 | 代码医生团队

在处理地理空间数据时,经常需要以最自然的方式可视化这些数据:地图。如果可以使用Python快速轻松地创建数据的交互式地图,在本教程中使用洛杉矶县所有星巴克位置的数据集。在文章的最后将能够创建:

  • 洛杉矶县所有星巴克酒店的基本点图
  • 一个等值线图,根据每个星巴克中包含的星巴克数量,在洛杉矶县的邮政编码中加以遮蔽
  • 一个热图这凸显了洛杉矶县星巴克的“热点”

你会需要:

  • Python包pandas。这用于在Python中轻松操作数据
  • Python包folium。这用于非常轻松地创建地图
  • 在洛杉矶县纬度/星巴克的经度电子表格

https://github.com/ritvikmath/StarbucksStoreScraping/blob/master/starbucksInLACounty.csv

  • LA县的GeoJSON(基本上是描述复杂形状的json)

https://github.com/ritvikmath/StarbucksStoreScraping/blob/master/laMap.geojson

  • LA县所有邮政编码的GeoJSON

https://github.com/ritvikmath/StarbucksStoreScraping/blob/master/laZips.geojson

为了熟悉数据,这里是前几行的快照:

只需要担心此分析的纬度,经度和zip字段。

以下是所需的Python导入,加载星巴克数据以及加载LA County GeoJSON

import folium
import pandas as pd
import json
from folium import plugins
 
df = pd.read_csv('starbucksInLACounty.csv')
 
with open('laMap.geojson') as f:
    laArea = json.load(f)

基本点图

从数据框中的纬度/经度对创建洛杉矶县所有星巴克的基本点图非常简单。

#initialize the map around LA County
laMap = folium.Map(location=[34.0522,-118.2437], tiles='Stamen Toner', zoom_start=9)
 
#add the shape of LA County to the map
folium.GeoJson(laArea).add_to(laMap)
 
#for each row in the Starbucks dataset, plot the corresponding latitude and longitude on the map
for i,row in df.iterrows():
    folium.CircleMarker((row.latitude,row.longitude), radius=3, weight=2, color='red', fill_color='red', fill_opacity=.5).add_to(laMap)
 
#save the map as an html    
laMap.save('laPointMap.html')

打开laPointMap.html,看到以下地图:

可以清楚地看到洛杉矶县的所有星巴克都是洛杉矶县内的小红点。当然可以自定义点的任何颜色和形状。

Choropleth地图

在使用Python中的地图之前,实际上不知道什么是等值线图,但事实证明它们在可视化聚合的地理空间数据方面非常有用。

等值线图将回答这个问题:“洛杉矶县哪些邮政编码的星巴克最多?”。基于其他变量的值,在案例中星巴克商店的数量,等值线图基本上在每个邮政编码中着色。

首先回顾创建一个所需的基本代码:

#group the starbucks dataframe by zip code and count the number of stores in each zip code
numStoresSeries = df.groupby('zip').count().id
#initialize an empty dataframe to store this new data
numStoresByZip = pd.DataFrame()
#populate the new dataframe with a 'zipcode' column and a 'numStores' column
numStoresByZip['zipcode'] = [str(i) for i in numStoresSeries.index]
numStoresByZip['numStores'] = numStoresSeries.values
 
#initialize the LA County map
laMap = folium.Map(location=[34.0522,-118.2437], tiles='Stamen Toner', zoom_start=9)
 
#draw the choropleth map. These are the key components:
#--geo_path: the geojson which you want to draw on the map [in our case it is the zipcodes in LA County]
 
#--data: the pandas dataframe which contains the zipcode information
# AND the values of the variable you want to plot on the choropleth
 
#--columns: the columns from the dataframe that you want to use
#[this should include a geospatial column [zipcode] and a variable [numStores]
 
#--key_on: the common key between one of your columns and an attribute in the geojson.
#This is how python knows which dataframe row matches up to which zipcode in the geojson
 
laMap.choropleth(geo_path='laZips.geojson', data=numStoresByZip, columns=['zipcode', 'numStores'], \
                 key_on='feature.properties.zipcode', fill_color='YlGn', fill_opacity=1)
 
laMap.save('laChoropleth.html')

由于个人发现更难理解如何将所有组件放到适当的位置,看一下单独的视觉效果,看看它是如何工作的。

例如,等值线需要知道填写邮政编码90001的颜色。它检查由所引用的数据帧大熊猫数据字段,搜索KEY_ON为邮政编码列,并发现中列出的其他列的列是numStores。然后它知道它需要在邮政编码90001中填写对应于3个商店的颜色。

然后它会查看geo_path字段引用的GeoJSON ,并找到邮政编码90001及其相关的形状信息,该信息告诉它在地图上为该邮政编码绘制哪种形状。通过这些链接,它具有所有必要的信息。来看看laChoropleth.html中产生的等值线!

看到它顶部有一个漂亮的彩条供参考。

热图

在上面的等值线图中,看到南洛杉矶县的地区似乎总体上有更多的星巴克商店,可以找出附近有很多星巴克店的地方吗?创建一个热图来突出洛杉矶县的星巴克“热点”。

#initialize the LA County map
laMap = folium.Map(location=[34.0522,-118.2437], tiles='Stamen Toner', zoom_start=9)
 
#add the shape of LA County to the map
folium.GeoJson(laArea).add_to(laMap)
 
#for each row in the Starbucks dataset, plot the corresponding latitude and longitude on the map
for i,row in df.iterrows():
    folium.CircleMarker((row.latitude,row.longitude), radius=3, weight=2, color='red', fill_color='red', fill_opacity=.5).add_to(laMap)
 
#add the heatmap. The core parameters are:
#--data: a list of points of the form (latitude, longitude) indicating locations of Starbucks stores
 
#--radius: how big each circle will be around each Starbucks store
 
#--blur: the degree to which the circles blend together in the heatmap
 
laMap.add_children(plugins.HeatMap(data=df[['latitude', 'longitude']].as_matrix(), radius=25, blur=10))
 
#save the map as an html
laMap.save('laHeatmap.html')

热图中需要一些试验和错误的主要参数是半径,它控制每个星巴克商店周围的圆圈大小以及控制圆圈“混合”在一起的模糊程度。

更高的半径意味着任何给定的星巴克影响更广泛的区域,更高的模糊意味着两个相距更远的星巴克仍然可以贡献一个热点。参数由您决定!

laHeatmap.html中看到热图的图片。

似乎一切都是红色的。如果放大热图可能会更有价值。放大一点看看是否可以识别更具体的热点。

从上面的地图可以清楚地看到,在地图中有一些热点和一些非热点。最引人注目的是洛杉矶市中心。

唯一遗憾的是,还没有找到一种方法将这些地图的实际交互式版本嵌入到Medium帖子中,所以只能显示截图。强烈建议通过此帖子运行一小段代码,以便自己使用交互式地图。这是一次完全不同的体验。

包含此分析中使用的所有代码的完整笔记本可以在GitHub上找到。

https://github.com/ritvikmath/StarbucksStoreScraping/blob/master/MakingLAMaps.ipynb

本文分享自微信公众号 - 相约机器人(xiangyuejiqiren)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的知识天地

遇到需要的登录的网站怎么办?学好python,用这3招轻松搞定!

9220
来自专栏Devops专栏

Python 正则表达式(贪婪和非贪婪模式)- 匹配颜值美女图片URL

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

31030
来自专栏数据科学与人工智能

pandas实现类SQL连接操作

我创建了Python语言微信群,定位:Python语言学习和实践。想要入群的伙伴,请加我的个人微信:luqin360,备注:Python入群。

16730
来自专栏Devops专栏

Python 正则表达式(r的作用)- 一个关于反斜杠转义的故事

与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。 假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要...

31540
来自专栏Devops专栏

python3 virtualenv virtualenvwrapper

安装虚拟环境包装器的目的是使用更加简单的命令来管理虚拟环境。 pip3 install virtualenvwrapper

22740
来自专栏Devops专栏

Python 线程 - 多线程

14130
来自专栏程序员的知识天地

python基础项目实战:制作一个简易的GUI界面浏览器

今天为大家介绍一个非常简单的TK第三方库来做的一个GUI界面浏览器,并需要你注册账号,密码方可登陆网站,这也是一个小小的权限控制,各位小可爱可以学一学,说实话还...

16120
来自专栏程序员的知识天地

用python爬取 20w 表情包之后,感叹我族人是多么强大!

https://fabiaoqing.com/biaoqing/lists/page/1.html

11730
来自专栏Devops专栏

Centos7 安装python3、pip3、ipython3

直接下载安装包如下: wget "https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz"

34720
来自专栏Python3爬虫100例教程

震惊!几道Python 理论面试题,Python面试题No18

解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,...

12320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励