热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用R包ggmap进行空间可视化

ggmap是在R环境里调用地图作用可视化的利器。它的语法结构跟ggplot2非常相似,也使R语言的用户可以迅速上手。ggmap结合ggplot可以方便快速绘制基于地图的可视化图表。下面

ggmap 是在R环境里调用地图作用可视化的利器。它的语法结构跟ggplot2非常相似,也使R语言的用户可以迅速上手。 ggmap 结合 ggplot 可以方便快速绘制基于地图的可视化图表。下面的文章里,我将用两个例子 (”三藩市的犯罪记录” 和 “Taxi in Porto“) 演示一下它的使用。案例数据均取自kaggle。

初步了解ggmap

  1. get_map: 是最基本的功能,可以用于从(google/openstreetmap)下载地图。

地图下载参数

  1. location: 如果我们知道数据的准确经纬度,我们可以直接使用。或者我们可以直接用geocode. (如 ‘San Francisco’ 用表示三藩市)
  2. maptype: 可以根据可视化的需要,选择 ‘terrain’, ‘satellite’, ‘roadmap’, ‘hybrid’, 通常“terrain”就可以达到不错的效果。
  3. zoom: 可以选择从 3 (大陆范围) 到 21 (建筑物范围). 因为这里的例子都是针对城市,所以我选择10-14 (城市范围)
  4. ggmap: 用作绘制地图,可以和ggplot叠加

旧金山的犯罪记录

这组数据 包含了旧金山从2013年至2015年的各种犯罪记录有及发生地点。让我以2014年的数据做以下的可视化演示。

了解数据

这里我们只需要使用犯罪的类别(Category),经度(X),纬度(Y)

head(data_2014[c('Category','DayOfWeek','PdDistrict','X','Y','Year')])
## Category DayOfWeek PdDistrict X Y Year
## 27585 LARCENY/THEFT Sunday MISSION -122.4356 37.76080 2014
## 27586 LARCENY/THEFT Sunday NORTHERN -122.4336 37.80004 2014
## 27587 VEHICLE THEFT Sunday CENTRAL -122.4128 37.78683 2014
## 27588 ASSAULT Sunday NORTHERN -122.4217 37.77364 2014
## 27589 ASSAULT Sunday NORTHERN -122.4217 37.77364 2014
## 27590 ASSAULT Sunday NORTHERN -122.4217 37.77364 2014

发生最为频繁的是Larceny, other offences, non-criminal, assault and vehicle theft, 然而在这些的类别里面other offences and non criminal并不能给我们带来太多信息。因此,我会在地图上显示Larceny, Assault and Vehicle Theft,这三种犯罪的空间密度。

Crime=data.frame(table(data_2014$Category))
Crime=Crime[order(Crime$Freq,decreasing=T),]
head(Crime)
## Var1 Freq
## 17 LARCENY/THEFT 18901
## 22 OTHER OFFENSES 10290
## 21 NON-CRIMINAL 9669
## 2 ASSAULT 6254
## 35 VEHICLE THEFT 3564
## 34 VANDALISM 3538

地图下载和绘制

Use ggmap to plot the map and use geom_jitter to plot the crimes in San Francisco:
使用get_map语句下载得到旧金山市区的地图。

library(ggmap)
map=get_map(location='San Fransico',maptype='roadmap',zoom=12)
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=San+Fransico&zoom=12&size=640x640&scale=2&maptype=roadmap&language=en-EN&sensor=false

使用ggmap语句绘制地图,geom_jitter画化不互相叠加的点,以表示每个犯罪的发生。

plot_crime <- ggmap(map)+geom_jitter(aes(X,Y,colour=Category),
data=data_2014[data_2014$Category %in% Top3,],alpha=0.2)+geom_jitter(aes(X,Y,colour=Category),
data=data0[data0$Category %in% Top3,],alpha=1)+labs(x='Longitude',y='Latitude')
plot_crime

plot of chunk unnamed-chunk-3

一些发现

在2014年里,Larceny/Theft (绿色)的案件要远远多过别的犯罪事件。大多数的犯罪发生在北海岸。
The assault crimes (红色)主要集中发生在 Tenderloin, 而该地区就是旧金山一个知名的high-crime neighbourhood 。
The Vehicle theft crime (蓝色) 的发生率比起前两种要少很多,没有特别严重的地区。

波尔图的出租车

这组数据 包含了波尔图出租车的位置轨迹信息。波尔图为葡萄牙的第二大城市。

了解数据

head(test[c('TRIP_ID','TAXI_ID','TIMESTAMP','DAY_TYPE','MISSING_DATA')])
## TRIP_ID TAXI_ID TIMESTAMP DAY_TYPE MISSING_DATA
## 1 T1 20000542 1408039037 A False
## 2 T2 20000108 1408038611 A False
## 3 T3 20000370 1408038568 A False
## 4 T4 20000492 1408039090 A False
## 5 T5 20000621 1408039177 A False
## 6 T6 20000607 1408037146 A False

在这里,我将只使用POLYLIN列的数据(出租车的运动轨迹)。这里我们定义POLYLIN的第一个位置为上客点,最后一个位置为下客点。

数据预处理

test$POLYLINE[1]
## [1] "[[-8.585676,41.148522],[-8.585712,41.148639],[-8.585685,41.148855],[-8.58573,41.148927],[-8.585982,41.148963],[-8.586396,41.148954],[-8.586072,41.14872],[-8.586324,41.147847],[-8.586999,41.14746],[-8.586576,41.147154],[-8.584884,41.146623]]"
getCoord=function(x){
x=gsub('[/[]','',x)
x=gsub(']','',x)
x=strsplit(x,',')[[1]]
n=length(x)
lon=as.numeric(x[seq(1,n,2)])
lat=as.numeric(x[seq(2,n,2)])
df=data.frame(lon=lon,lat=lat)
df$status='moving'
df$status[1]='pickup'
df$status[nrow(df)]='dropoff'
return(df)
}

通过一些处理,我们可以从POLYLINE数据中,提取经纬度,以及出租车的运动状态。

loc=NULL
for (i in 1:length(polyline)){
loc=rbind(loc,getCoord(polyline[i]))
}
head(loc)
## lon lat status
## 1 -8.585676 41.14852 pickup
## 2 -8.585712 41.14864 moving
## 3 -8.585685 41.14885 moving
## 4 -8.585730 41.14893 moving
## 5 -8.585982 41.14896 moving
## 6 -8.586396 41.14895 moving

运用同样的方法, 我们用ggmap画出波尔图的城市地图以及出租车的运动轨迹。

library(ggmap)
map=get_map(location=c(lon=median(loc$lon),lat=median(loc$lat)),
maptype='roadmap',zoom=13)
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=41.161833,-8.612033&zoom=13&size=640x640&scale=2&maptype=roadmap&language=en-EN&sensor=false
plot_taxi=ggmap(map)+labs(x='Longitude',y='Latitude')+
geom_jitter(aes(lon,lat,colour=factor(status)),data=loc[loc$status=='moving',],alpha=0.4)+
geom_point(aes(lon,lat,colour=factor(status)),data=centers,size=10,alpha=0.6)+
geom_jitter(aes(lon,lat,colour=factor(status)),data=loc[loc$status!='moving',],alpha=0.8)
plot_taxi

plot of chunk unnamed-chunk-7

一些发现

我从未去过葡萄牙,但是我也可以猜到Vitoria是商业中心或者是风景名胜,因为出租车的在那里的运动密度特别大。
我们发现在东北和西北有两个主要的上客和下客地点,推测可能是居住的密集区。如果你注意到图中几个大的点,那是用kmeans聚类的上下客的地点。

the completed R code is available: here, if you are interested to check out.


推荐阅读
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
郭城镣
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有