打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
R for map (3下):ggmap

R for map (3下):ggmap

2013-01-20 22:10:05
(5)ggmap( )


在没有额外参数的情况下,ggmap函数相当于返回下面的ggplot对象:
ggplot(aes(x=lon, y=lat), data=fourCorners)
geom_blank() coord_map('mercator')
annotation_raster(ggmap,
xmin, xmax, ymin, ymax)

其中fourCorners是一个数据框,是把expand.grid运用到指定的ggmap对象的bb属性的经纬度范围得到的。

ggmap函数有很多可选的参数:
extent参数规定图形设备中多大的区域被地图覆盖,有'normal','device'和'panel'三个值。
base_layer参数是用用户指定的基础画布替代默认画布(ggplot(aes(x=lon,y=lat),data=fourCorners))。

legend 和padding参数与图例(legend)有关。legend参数决定图例可以画在地图什么位置,可选值为'left',
'right' (default), 'bottom', 'top', 'topleft',
'bottomleft', 'topright', 'bottomright'和'none'。
padding决定画图例的时候,离地图的角落有多远。

darken参数用来为地图染色。默认值为c(0,'black'),第一个值对应一个透明度(alpha),第二个值对应颜色。

例图:1月1日京津地区部分城市的空气质量
数据取自中国环境监测总站
library(XML)
library(ggmap)
library(plyr)

url<-'http://www.cnemc.cn/citystatus/airDailyReportMore.jsp?selmCity=&chkmCity=checkbox&selYear=2013&selMonth=1&selDay=1&chkTime=checkbox&txtPolluteRataMin=&txtPolluteRataMax=&selPolluteStyle=%BF%C9%CE%FC%C8%EB%BF%C5%C1%A3%CE%EF&selAirQuality=%C7%E1%CE%A2%CE%DB%C8%BE&selPolluteLevel=I'
table<-readHTMLTable(url)

raw<-table[[6]]

head(raw)

data<-raw[3:9,2]

data1<-as.numeric(gsub(',','',data))

names<-c('beijing','tianjin','shijiazhuang','tangshan','qinghuangdao','handan','baoding')
lacation<-adply(names,1,geocode)

cnames<-c('北京','天津','石家庄','唐山','秦皇岛','邯郸','保定')

air<-data.frame(lacation,data1,cnames)

airmap<-qmap('tianjin',zoom=7,extent='device',legend='none',darken=.2)
airmap
geom_point(data=air,aes(x=lon,y=lat,size=data1),colour='red')
geom_text(data=air,colour='black',aes(x=(lon 0.5),y=lat,label=as.factor(data1)),hjust=1,vjust=0)
geom_text(data=air,colour='black',aes(x=lon,y=lat,label=cnames,fontface=2),size=6,hjust=1,vjust=0)




(6)ggmap包的其它函数
除了绘图的get_map,ggmap和qmap函数,ggmap包还有一些独具功能的函数帮助我们进行地理数据的分析。

(a)geocode( )

这个函数我们前面已经用过了。它接受字符串并返回地理信息的数据框。默认的返回选项是output='simple',
只返回经纬度坐标。如果output='more'会有更多的输出值:
>geocode('beijing normal university',output='more')

   lon lat type loctype
1 116.3656 39.9622 point_of_interest approximate
                                                                                  address
1 beijing normal university, 19号 xinjiekou outer street, haidian, beijing, china, 100088
     north south east west postal_code country
1 39.97076 39.95365 116.3816 116.3496 100088 china
  administrative_area_level_2 administrative_area_level_1 locality
1 <NA> beijing beijing
                  street streetNo point_of_interest
1 xinjiekou outer street NA beijing normal university
                      query
1 beijing normal university

如果选择output = 'all',则会返回有rjson包解析的整个Google Geocoding API的JSON树。


(b)revgeocode()

这个函数可以看做geocode()的逆函数。它把经纬度坐标转换为实际地址。
> bnu<-geocode('beijing normal university')
> (bnu <- as.numeric(bnu))
[1] 116.3656 39.9622

> revgeocode(bnu)
[1] 'Jingshi Road, Haidian, Beijing, China, 100088'

如果在revgeocode( )里选择output='more',也会输出相关的地理信息。

(c)mapdist()

这个函数调用Google Distance Matrix API,可以计算两个地址之间的距离,而且还会根据两地的Google路线计算步行、自行车和汽车所需的相应时间。
> mapdist('tianjin', 'beijing',mode='driving')
     from to m km miles seconds minutes hours
1 tianjin beijing 139300 139.3 86.56102 6785 113.0833 1.884722

(d)route()

route()函数返回地图上两地之间由一系列线段所构成的路线,每一个线段都有其起点和终点的经纬度。

#关于ggmap的地图以后还会再画的,找合适的数据不太容易。

分享到   
推荐 2人
2人 喜欢 喜欢
2013-04-18 08:41:03 山尘子

> tmp
m km miles seconds minutes hours leg lon lat group volue
1304 30418 30.418 18.9017452 1133 18.8833333 0.314722222 1 112.5995 37.92389 186 8738
1305 1714 1.714 1.0650796 142 2.3666667 0.039444444 2 112.7303 38.16109 186 8738
1306 4 0.004 0.0024856 0 0.0000000 0.000000000 3 112.7241 38.17185 186 8738
1307 915 0.915 0.5685810 249 4.1500000 0.069166667 4 112.7241 38.17181 186 8738
1308 1945 1.945 1.2086230 89 1.4833333 0.024722222 5 112.7304 38.16647 186 8738
1309 NA NA NA NA NA NA NA 112.7275 38.14940 186 8738
1682 6565 6.565 4.0794910 265 4.4166667 0.073611111 1 112.9488 35.59958 247 6991
1683 747 0.747 0.4641858 71 1.1833333 0.019722222 2 112.9381 35.54198 247 6991
1684 7 0.007 0.0043498 50 0.8333333 0.013888889 3 112.9348 35.53643 247 6991
1685 363 0.363 0.2255682 32 0.5333333 0.008888889 4 112.9349 35.53647 247 6991
1686 276785 276.785 171.9941990 11222 187.0333333 3.117222222 5 112.9353 35.53962 247 6991
1687 8506 8.506 5.2856284 344 5.7333333 0.095555556 6 112.5575 37.75586 247 6991
1688 9696 9.696 6.0250944 406 6.7666667 0.112777778 7 112.6511 37.77148 247 6991
1689 NA NA NA NA NA NA NA 112.6156 37.84515 247 6991
你好,比如我有如上的数据,我想按照不同的group来画图,也就是说画上两条路径,而不是一条连续的路径,怎么操作呢?

> 删除
2013-04-18 08:46:39 山尘子
> tmp m km miles seconds minutes hours leg lon l > tmp m km miles seconds minutes hours leg lon lat group volue1304 30418 30.418 18.9017452 1133 18.8833333 0.314722222 1 112.5995 37.92389 186 87381305 1714 1.714 1.0650796 142 2.3666667 0.039444444 2 112.7303 38.16109 186 87381306 4 0.004 0.0024856 0 0.0000000 0.000000000 3 112.7241 38.17185 186 87381307 915 0.915 0.5685810 249 4.1500000 0.069166667 4 112.7241 38.17181 186 87381308 1945 1.945 1.2086230 89 1.4833333 0.024722222 5 112.7304 38.16647 186 87381309 NA NA NA NA NA NA NA 112.7275 38.14940 186 87381682 6565 6.565 4.0794910 265 4.4166667 0.073611111 1 112.9488 35.59958 247 69911683 747 0.747 0.4641858 71 1.1833333 0.019722222 2 112.9381 35.54198 247 69911684 7 0.007 0.0043498 50 0.8333333 0.013888889 3 112.9348 35.53643 247 69911685 363 0.363 0.2255682 32 0.5333333 0.008888889 4 112.9349 35.53647 247 69911686 276785 276.785 171.9941990 11222 187.0333333 3.117222222 5 112.9353 35.53962 247 69911687 8506 8.506 5.2856284 344 5.7333333 0.095555556 6 112.5575 37.75586 247 69911688 9696 9.696 6.0250944 406 6.7666667 0.112777778 7 112.6511 37.77148 247 69911689 NA NA NA NA NA NA NA 112.6156 37.84515 247 6991你好,比如我有如上的数据,我想按照不同的group来画图,也就是说画上两条路径,而不是一条连续的路径,怎么操作呢? ... 山尘子

不好意思,生成两条路径已经解决了,但是还有个问题就是,由于用route载入的经纬度数据不够,容易生成直线而不是弯曲的路径,怎么办呢

> 删除
2013-04-18 17:45:28 船长阿道克

经纬度不够 或许可以尝试差值?

> 删除
2013-04-18 19:58:10 山尘子
经纬度不够 或许可以尝试差值? 经纬度不够 或许可以尝试差值? 船长阿道克

直线内插啊,应该不行的

> 删除
2013-05-19 04:59:06 xbw

还是感觉清理URL获取的数据是最难操作的。。raw<-table[[6]]是指读取前六列,不是第六列?

> 删除
2013-05-19 09:18:48 船长阿道克

读进来网页的所有table(列表形式),需要其中的第六个

> 删除
2013-05-19 18:37:55 xbw

不好意思,由于专业所限还是不太理解网页是如何读取的。。这里所有的所有table是url地址下的“空气质量查询”这个表格吗?那第六个岂不是表格中“时间”这一栏?

> 删除
2013-05-19 18:41:14 船长阿道克

这和专业没关系。你可以看一下那个table嘛。

> 删除
2013-05-19 18:46:26 xbw
不好意思,由于专业所限还是不太理解网页是如何读取的。。这里所有的所有table是url地址下的“空 不好意思,由于专业所限还是不太理解网页是如何读取的。。这里所有的所有table是url地址下的“空气质量查询”这个表格吗?那第六个岂不是表格中“时间”这一栏? ... xbw

包括这篇http://en.worldstat.info/World/List_of_countries_by_Population_under_15_years_old,如何知道需要的table是哪一个?打开读取的table,显示:structure(list(`NULL` = NULL, `NULL` = structure(list(V1 = structure(c(22L,
141L, 1L, 212L, 150L, 126L, 227L, 132L, 66L, 41L, 34L, 139L,
……
113L, 53L, 187L, 77L, 103L, 134L, 91L, 180L), .Label = c('',
'Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Angola', 'Anguilla',
……
'Saudi Arabia', 'Select a country or continent---------------------------------------------------------------The WorldAfricaAsiaCentral America and the CaribbeanEuropeNorth AmericaOceaniaSouth America---------------------------------------------------------------<U 00A0>Afghanistan<U 00A0>Albania<U 00A0>Algeria<U 00A0>Andorra<U 00A0>Angola<U 00A0>Anguilla<U 00A0>Antigua and Barbuda<U 00A0>Argentina<U……然后就晕了。。辛苦船长了!拜谢

> 删除
2013-05-19 18:52:34 船长阿道克

str(table)

> 删除
2013-05-19 19:44:40 xbw
这和专业没关系。你可以看一下那个table嘛。 这和专业没关系。你可以看一下那个table嘛。 船长阿道克

又跑了下其他网址数据,好像懂了,谢谢船长。。List of 7
$ NULL:'data.frame': 46 obs. of 6 variables:
$ NULL: NULL
$ NULL:'data.frame': 44 obs. of 6 variables:
$ NULL:'data.frame': 10 obs. of 2 variables:
$ NULL: NULL
$ NULL:'data.frame': 33 obs. of 6 variables:
$ NULL:'data.frame': 31 obs. of 6 variables:
第一、三、六、七列表里都包含了所需信息,而言第七个相对更简洁

> 删除
2013-05-19 20:18:07 船长阿道克

我也是爱好者,对于计算机专业知识掌握的也不多。多练多试。

> 删除
2013-12-14 12:09:47 Captain L. (帝力于我何有哉?)

请教个问题:


http://cos.name/cn/topic/143093?replies=1#post-285857

> 删除
2013-12-14 15:28:35 Captain L. (帝力于我何有哉?)

后来我改了不用ggmap了,用的是map,效果也不错:
http://www.douban.com/note/281570364/

> 删除
2013-12-14 18:18:58 船长阿道克
后来我改了不用ggmap了,用的是map,效果也不错:http://www.douban.com/note/281570364/ 后来我改了不用ggmap了,用的是map,效果也不错:http://www.douban.com/note/281570364/ Captain L.

ggmap好像只能画到大洲这个级别,zoom=2;maps包画全球地图方便,画中国地图不方便,而且用的地理信息数据是比较老的(好像是上世纪80年代的?还有苏联)。其实用R画地图的手段很多。我个人认为,要绘制精确性和美观性兼顾的地图还是需要更完整的地理信息数据。

> 删除
2013-12-14 19:04:36 Captain L. (帝力于我何有哉?)
ggmap好像只能画到大洲这个级别,zoom=2;maps包画全球地图方便,画中国地图不方便,而且用的地 ggmap好像只能画到大洲这个级别,zoom=2;maps包画全球地图方便,画中国地图不方便,而且用的地理信息数据是比较老的(好像是上世纪80年代的?还有苏联)。其实用R画地图的手段很多。我个人认为,要绘制精确性和美观性兼顾的地图还是需要更完整的地理信息数据。 ... 船长阿道克

中国的画图参见 邱怡轩的那个~

> 删除
2013-12-14 19:43:05 船长阿道克
中国的画图参见 邱怡轩的那个~ 中国的画图参见 邱怡轩的那个~ Captain L.

那个用了额外的数据,我也画过的。

> 删除
2016-07-12 17:32:46 小叶

船长,能具体讲解一下route()函数的用法吗?举个实例。

> 删除

> 我来回应
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一文教你绘制Cell文章中SNP的地理分布图
Python实现经纬度换算 计算两地距离 地理可视化(代码全分享)
高德地图车机版API演示程序
【新提醒】matlab中地图边界与掩膜(去掉边界外区域)的实现(基于shape文件)
OpenLayers项目分析——(三)BaseTypes-睁眼瞎看-3sNew...
R语言可以这么玩 | 绘制地图与地点数据可视化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服