R时代,你要奈何画舆图?
不知道列位泛泛有没有过需要画舆图的需求,有的时候需要在舆图上标出特定位置的数据表示可能一些数值,然而怎么实现?
这里主要先容下在R语言中绘制舆图的小我私家琢磨的思路。绘制舆图步调有三:
- 你得需要绘制舆图;(约便是空话)
- 你得有要绘制舆图的地理信息,经纬度啊,界线啊等等;
- 你得操作2的数据在R中画出来。
以上步调中,今朝最要害的是2,一旦2的数据有了,在R中不就是把它们连起来嘛,这个对付R来说就是调戏它,就跟全民调戏小黄鸡一样。
R语言中绘制舆图的思路也是由于2的获取方法纷歧样而分隔的。
第一种思路:有一些R包中存储着常见舆图的数据,好比maps包中存有世界舆图、美国舆图、美国各州郡舆图、法国舆图以及加拿多半会舆图等,加载了这个包,就可以轻松愉快地绘制上述舆图。mapdata包中存有中国舆图的数据,可是较量旧了,这个数据,重庆还没有从四川分出来呢。
总体来讲,第一种思路受包中已有的数据数量限制(但我R包多!),假如各个包中都没有梵蒂冈的信息,那咋办啊(其实可以通过绘制世界舆图,然后限制区域把梵蒂冈画出来)。并且,假如我想画中国人民大学的舆图怎么办???哭……
第二种思路:我先去一个处所下载所绘图的地理数据,然后读入R举办绘制。好比由于mapdata中的中国舆图较量长远了,谢老大的《终于搞定中国分省市舆图》一文中就先容了,先从国度基内地理信息中心下载中国各省市的地理数据,之后再绘制。厥后肖凯老师又先容googleVis包也可以凭据这个思路来绘制舆图,详细可参考《操作googleVis包实现情况数据可视化》(友情提示,需科学上网)。之后的OpenStreetMap包也是提供了利便下载地理数据的途径。
如您所看到的,第二种途径的步调稍多,倒霉于各人上手。我知道,假如进程越长,越艰苦,最终绘制出舆图的那一刻的快感就越强烈,可是“少折腾”的指示,照旧提醒我们,只管化繁为简。于是第三种的思路,就是既担任了第一种思路简捷的操纵方法,又吸取了第二种思路的数据来历遍及的优势。
第三种思路:既然R是自由的,那我能不能直接去调取专业的舆图企业可能网站的数据呢,这样就不会受包中数据集所限,我只需要有一个途径去专业的舆图供给商那取数据就可以了,好比Google Map,Baidu Map等,这可都是专业的舆图网站,内里的地理数据包罗万象,想取啥取啥。自由的R只需要毗连Google Map的API,一切就都有了,虽然Google大爷不会让你无限制的取数据,今朝的限制是2000次(应该是单天的限制),于是ggmap包降生了,两位作者David Kahle和 Hadley Wickham真是太会解放全球人民了,而且该包中有几个让我无比感动的呼吁,下文见!!!
好,我们先来凭据第一种思路来画几个图:
1、 画世界舆图
假如是首次利用,需要在R中装载maps包(install.packages('maps')
),这个包中存有世界舆图和美国舆图的舆图数据,所以,几行代码便可以画出世界舆图。
代码如下:
library(maps) map("world", fill = TRUE, col = rainbow(200), ylim = c(-60, 90), mar = c(0, 0, 0, 0)) title("世界舆图")
输出为:
无比烂漫的世界,引无数骚客竞折腰啊……
2、 画美国舆图
同样在maps包中包括了美国舆图和美国各州郡的具体舆图数据,同样的,也可以用简朴的代码画出美国舆图,便于我们利用。
代码如下:
library(maps) map("state", fill = TRUE, col = rainbow(209), mar = c(0, 0, 2, 0)) title("美国舆图")
输出为:
整体形状这是像啥啊,山姆大叔……
对付美国舆图,该包提供画出指定几个州的图,好比这里只画出New York, New Jersey, Penn三州的舆图:
代码如下:
library(maps) map('state', region = c('new york', 'new jersey', 'penn'), fill = TRUE, col = rainbow(3), mar = c(2, 3, 4, 3)) title("美国三州舆图")
输出功效为:
三州大力!!
3、 画中国舆图
上述的maps包中并没有中国舆图的数据 ,在别的一个包mapdata中有中国舆图的数据(较量旧的数据)。
代码如下:
library(maps) library(mapdata) map("china", col = "red4", ylim = c(18, 54), panel.first = grid()) title(" 中国舆图")
输出为:
哭,重庆在那边,重庆在那边??
好,我们来强力先容ggmap包,先来说下该包让我惊奇的几个呼吁:
1、geocode()
好比:
> geocode("Beijing") lon lat 1 116.4075 39.90403
这年迈可以返回一个处所的经纬度,那我再调戏之:
> #这意思就是年迈你多给点!! > geocode("Renmin University of China", output = "more") lon lat type loctype 1 116.3184 39.96998 point_of_interest approximate address 1 renmin university of china, 59号 zhongguancun street, haidian, beijing, china, 100086 north south east west postal_code country 1 39.97853 39.96142 116.3345 116.3024 100086 china administrative_area_level_2 administrative_area_level_1 locality 1 <NA> beijing beijing street streetNo point_of_interest 1 zhongguancun street NA renmin university of china query 1 Renmin University of China
信息给多了,我说几个点,不单有人民大学的经纬度,尚有该大学的具体地点(中国人民大学,中关村大街59号,海淀,北京,中国),尚有邮编好吧100086!!!!可是仿佛跟我们实际的100872有差距(倒是跟10086很靠近啊),可是它确实是返回了邮政编码,尚有zhongguancun street就不说了……这完全就是返回的Google舆图存储的人民大学的信息啊……
2、mapdist()
第二个颠颤颤的呼吁式mapdist()。好比:
> mapdist('China Agricultural University', + 'Renmin University of China', 'walking') from to m km 1 China Agricultural University Renmin University of China 6022 6.022 miles seconds minutes hours 1 3.742071 4523 75.38333 1.256389
1 mile = 1609米。
这意思就是说从农大到人大间隔6022米,假如您步行,需要4523秒……汗,我下次思量下步行试试。不外,您说的是农大东校区照旧农大西校区啊……
另,ggmap包中不只仅可以调取Google Map的数据,还可以调取OpenStreetMap (‘osm’)、Stamen Maps (‘stamen’)和CloudMade maps (‘cloudmade’)。亲,这够用了吧。那舆图的表示形式也是本性化的,有’terrain’(阵势图)、’satellite’(卫星图)、’roadmap’(阶梯图)和 ‘hybrid’(殽杂)等。您自个儿选。
其他的不谈了,直接画舆图:
1、中国舆图
library(ggmap) library(mapproj) ## Google啊Google给我China的舆图数据吧 map <- get_map(location = 'China', zoom = 4) ggmap(map)
于是:
我天朝雄赳赳,气昂昂啊!!请留意左下角的Google logo!!
再来北京阶梯舆图:
#Google啊Google给我Beijing的公路舆图数据吧 map <- get_map(location = 'Beijing', zoom = 10, maptype = 'roadmap') ggmap(map)
于是:
最后,我想看下大冬天的有没有人在人民大学的各个楼顶上晒太阳浴:
## Google啊Google给我RUC的卫星舆图数据吧 map <- get_map(location = 'Renmin University of China', zoom = 14, maptype = 'satellite') ggmap(map)
太不清楚了,基础看不清楚哪跟哪啊。就这么着吧,我预计快够当天限制数了。
最厥后个正经的,借用肖凯老师编好的代码(肖老师的原文后头尚有用谢老大animation包做的动态图呢),从中国地动数据中心下载 2013.1.5-2013.1.11 这一周产生在中国的小地动,呃,应该都是小地动,因为没有听到相关的大地动的新闻报道。