R for map (2上)
书接上文,继续利用shapefile数据结合ggplot2和maptools包来画地图
shapefile数据的复杂之处在于,用readShapePoly读入以后并非普通的数据框,可用str( )看看里边的内容,这个数据集包含了全部的地理信息,R按顺序把其中包含的925个多边形区域依次画出。处理不慎损失信息的话,地图可能会画成很奇怪的样子。所以我们需要先把读入的数据转化为一个dataframe,这用到了ggplot2包的fortify函数。
library(maptools)
china_map<-readShapePoly("bou2_4p.shp")
x<-china_map@data
xs<-data.frame(x,id=seq(0:924)-1)
library(ggplot2)
china_map1<-fortify(china_map) #转化为数据框
看一下这个数据框的内容
> head(china_map1)
long lat order hole piece group id
1 121.4884 53.33265 1 FALSE 1 0.1 0
2 121.4995 53.33601 2 FALSE 1 0.1 0
3 121.5184 53.33919 3 FALSE 1 0.1 0
4 121.5391 53.34172 4 FALSE 1 0.1 0
5 121.5738 53.34818 5 FALSE 1 0.1 0
6 121.5840 53.34964 6 FALSE 1 0.1 0
没有行政区域的信息啊,这就需要前面的那个数据框xs了。
library(plyr)
china_mapdata<-join(china_map1, xs, type = "full") #合并两个数据框
再看看
>head(china_mapdata)
long lat order hole piece group id AREA PERIMETER BOU2_4M_ BOU2_4M_ID ADCODE93 ADCODE99 NAME
1 121.4884 53.33265 1 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
2 121.4995 53.33601 2 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
3 121.5184 53.33919 3 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
4 121.5391 53.34172 4 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
5 121.5738 53.34818 5 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
6 121.5840 53.34964 6 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
下面用这个新的数据框来画中国地图
ggplot(china_mapdata, aes(x = long, y = lat, group = group,fill=NAME))+
geom_polygon( )+
geom_path(colour = "grey40")+
scale_fill_manual(values=colours(),guide=FALSE)
也可以利用它来区域地图
zhejiang<-subset(china_mapdata,NAME=="浙江省")
ggplot(zhejiang, aes(x = long, y = lat, group = group,fill=NAME))+
geom_polygon(fill="beige" )+
geom_path(colour = "grey40")+
ggtitle("中华人民共和国浙江省")+
geom_point(x=120.12,y=30.16,fill=FALSE)+
annotate("text",x=120.3,y=30,label="杭州市")
在复杂一点,来画中国人口地图,各省的人口数据来自国家统计局2010年人口普查数据,台湾和香港的数据来自百度(没有澳门,上一篇讨论过这个数据集没有澳门的区域)
NAME<-c("北京市","天津市","河北省","山西省","内蒙古自治区","辽宁省","吉林省",
"黑龙江省","上海市","江苏省","浙江省","安徽省","福建省", "江西省","山东省","河南省",
"湖北省", "湖南省","广东省", "广西壮族自治区","海南省", "重庆市","四川省", "贵州省",
"云南省","西藏自治区","陕西省","甘肃省","青海省","宁夏回族自治区","新疆维吾尔自治区",
"台湾省","香港特别行政区")
pop<-c(7355291,3963604,20813492,10654162,8470472,15334912,9162183,13192935,8893483,25635291,20060115,19322432,11971873,11847841,30794664,26404973,
17253385,19029894,32222752,13467663,2451819,10272559,26383458,10745630,
12695396,689521,11084516,7113833,1586635,1945064,6902850,23193638,7026400)
pop<-data.frame(NAME,pop)
把人口信息和行政区域地图结合起来有几种办法,下面的是一种偷懒的方法,把人口数据和行政地图合并。
china_pop<-join(china_mapdata, pop, type = "full")
ggplot(china_pop, aes(x = long, y = lat, group = group,fill=pop))+
geom_polygon( )+
geom_path(colour = "grey40")
图上浅色部分即为几个人口大省。
#####
说明一下(1)这一篇的图用plot( )都可以完成,我这里使用ggplot2的原因是ggplot2潜在的美观上的可扩展性。
(2)个人体会,画地图的难点不在如何绘图,而在如何整理数据以供绘图之用。
shapefile数据的复杂之处在于,用readShapePoly读入以后并非普通的数据框,可用str( )看看里边的内容,这个数据集包含了全部的地理信息,R按顺序把其中包含的925个多边形区域依次画出。处理不慎损失信息的话,地图可能会画成很奇怪的样子。所以我们需要先把读入的数据转化为一个dataframe,这用到了ggplot2包的fortify函数。
library(maptools)
china_map<-readShapePoly("bou2_4p.shp")
x<-china_map@data
xs<-data.frame(x,id=seq(0:924)-1)
library(ggplot2)
china_map1<-fortify(china_map) #转化为数据框
看一下这个数据框的内容
> head(china_map1)
long lat order hole piece group id
1 121.4884 53.33265 1 FALSE 1 0.1 0
2 121.4995 53.33601 2 FALSE 1 0.1 0
3 121.5184 53.33919 3 FALSE 1 0.1 0
4 121.5391 53.34172 4 FALSE 1 0.1 0
5 121.5738 53.34818 5 FALSE 1 0.1 0
6 121.5840 53.34964 6 FALSE 1 0.1 0
没有行政区域的信息啊,这就需要前面的那个数据框xs了。
library(plyr)
china_mapdata<-join(china_map1, xs, type = "full") #合并两个数据框
再看看
>head(china_mapdata)
long lat order hole piece group id AREA PERIMETER BOU2_4M_ BOU2_4M_ID ADCODE93 ADCODE99 NAME
1 121.4884 53.33265 1 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
2 121.4995 53.33601 2 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
3 121.5184 53.33919 3 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
4 121.5391 53.34172 4 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
5 121.5738 53.34818 5 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
6 121.5840 53.34964 6 FALSE 1 0.1 0 54.447 68.489 2 23 230000 230000 黑龙江省
下面用这个新的数据框来画中国地图
ggplot(china_mapdata, aes(x = long, y = lat, group = group,fill=NAME))+
geom_polygon( )+
geom_path(colour = "grey40")+
scale_fill_manual(values=colours(),guide=FALSE)
也可以利用它来区域地图
zhejiang<-subset(china_mapdata,NAME=="浙江省")
ggplot(zhejiang, aes(x = long, y = lat, group = group,fill=NAME))+
geom_polygon(fill="beige" )+
geom_path(colour = "grey40")+
ggtitle("中华人民共和国浙江省")+
geom_point(x=120.12,y=30.16,fill=FALSE)+
annotate("text",x=120.3,y=30,label="杭州市")
在复杂一点,来画中国人口地图,各省的人口数据来自国家统计局2010年人口普查数据,台湾和香港的数据来自百度(没有澳门,上一篇讨论过这个数据集没有澳门的区域)
NAME<-c("北京市","天津市","河北省","山西省","内蒙古自治区","辽宁省","吉林省",
"黑龙江省","上海市","江苏省","浙江省","安徽省","福建省", "江西省","山东省","河南省",
"湖北省", "湖南省","广东省", "广西壮族自治区","海南省", "重庆市","四川省", "贵州省",
"云南省","西藏自治区","陕西省","甘肃省","青海省","宁夏回族自治区","新疆维吾尔自治区",
"台湾省","香港特别行政区")
pop<-c(7355291,3963604,20813492,10654162,8470472,15334912,9162183,13192935,8893483,25635291,20060115,19322432,11971873,11847841,30794664,26404973,
17253385,19029894,32222752,13467663,2451819,10272559,26383458,10745630,
12695396,689521,11084516,7113833,1586635,1945064,6902850,23193638,7026400)
pop<-data.frame(NAME,pop)
把人口信息和行政区域地图结合起来有几种办法,下面的是一种偷懒的方法,把人口数据和行政地图合并。
china_pop<-join(china_mapdata, pop, type = "full")
ggplot(china_pop, aes(x = long, y = lat, group = group,fill=pop))+
geom_polygon( )+
geom_path(colour = "grey40")
图上浅色部分即为几个人口大省。
#####
说明一下(1)这一篇的图用plot( )都可以完成,我这里使用ggplot2的原因是ggplot2潜在的美观上的可扩展性。
(2)个人体会,画地图的难点不在如何绘图,而在如何整理数据以供绘图之用。
已知经纬度:
108°21′ E,29°05′ N
105°48′ E,34°09′N
如何在中国地图上定位出点,并在定位的点加汉字“红松”, “杨树”
初次学习。可以告知代码?谢谢
你好,可参考文中浙江省图,杭州市的标注
新手请教船长大侠:1,china_map@Data中@Data怎么理解,它的作用是?2,经过fortify处理得到的china_map1有91040个点,这个数据就是构成行政边界多边形的点(点构成多边形)吧?期待回复谢谢!
关于那个@,可以参考str(china_map),是对成分的引用。china_map是一种特殊的数据框,叫做SpatialPolygonsDataFrame。91040个点就是构成多边形的点。
感谢!从船长这边学到不少东西,持续关注!
受益颇多。
请教船长,有两个问题:在参考文中浙江省图杭州市的标注,添加标签时,似乎不能一次针对两个位置,添加两个标签。请教船长,如何在地图上添加各省市的名称?
另外,在中国分省地图上,如何画出宁波的边界呢?
逐批添加是可行的,参考这一篇。http://site.douban.com/182577/widget/notes/10568279/note/259039559/。利用shapefile数据画出宁波市,需要知道相关的数据才行。
船长:
我用下面的语句向地图上加点
ggplot(china_ratio, aes(x = long, y = lat, group = group,fill=分类))+geom_polygon( )+geom_path(colour="gray40")+
geom_point(data=shenghui,aes(x=shenghui$jd,y=shenghui$wd))
错误提示为:错误于eval(expr, envir, enclos) : 找不到对象'group'
我验证过,问题出在geom_point()语句。
您能指点下是什么原因,该如何修改吗?
要不你把你的省会和china_ratio合并一下试试?
建议先学一下ggplot2.
运行china_map<-readShapePoly("bou2_4p.shp")后,出现报错:Error in getinfo.shape(filen) : Error opening SHP file。请问这是什么原因?
这个文件不是R自带的,参见上一篇。
你说的上一篇标题是什么,我找了下之前两篇跟画中国地图都没关系,压根就没出现中国地图的字眼。或者是我找错了,麻烦给指出下标题,谢谢!
多翻了几下,找到r for map 1和0了,谢谢了!
想问一下
运行:ggplot(zhejiang, aes(x = long, y = lat, group = group,fill=NAME))+
geom_polygon(fill="beige" )+
geom_path(colour = "grey40")+
ggtitle("中华人民共和国浙江省")+
geom_point(x=120.12,y=30.16,fill=FALSE)+
annotate("text",x=120.3,y=30,label="杭州市")
出现:Error: 'FALSE'颜色名字不对
可以怎么修改?
geom_point(x=120.12,y=30.16,fill=FALSE)+
这一行,改成fill="black"试试
我想问一下,世界地图的经纬度这个怎么弄啊?我想画出关于世界上各个国家的人口展示图,不同的人口颜色深度不同,但是不知道怎么对照着国家的区域
请问您,这个问题解决了吗?我也是同样的问题,向您请教,谢谢了
> 我来回应