ggplot2中如何自定义数据地图版面范围~

2018-04-11 16:54:12 浏览数 (1)

之前联系过程中遇到的一个小技术问题,就是在ggplot2制作数据地图时,使用标度调整参数进行范围限定时,总是出现错误,版面上出现交错的线条和条带。

应该是自己添加的标度限定参数与ggplot2映射规则出现了冲突,特别再加上空间投影参数,这种冲突和错乱就显得更加明显。

其实我就是想要获取这样一幅数据地图,而不是做完整个世界地图之后再去裁剪导出的图片。(那样会显得很不fashion)。

library("ggplot2") library("plyr") library("maptools") library("ggthemes") options(stringsAsFactors=FALSE,warn=FALSE)

world_map <-readShapePoly("D:/R/rstudy/wold_map/World_region.shp") x <- world_map@data xs <- data.frame(x,id=seq(0:250)-1) world_map1 <- fortify(world_map) world_map_data <- join(world_map1, xs, type = "full") mydata <- read.csv("D:/R/rstudy/wold_map/Region_map.csv")

mydata$fam<-cut(mydata$zhibiao1,breaks=c(0,100,200,300,400,500),labels=c('0~100','100~200','200~300','300~400','400~500'),order=TRUE,include.lowest=TRUE) world_data <- join(world_map_data, mydata, type="full")

这是完整的世界地图:

windowsFonts(myfont=windowsFont("微软雅黑 Light")) ggplot(world_data, aes(x = long, y = lat, group = group,fill =fam)) geom_polygon(colour="white") scale_fill_brewer(palette="Blues") ###Blues&Greens ggtitle("某公司2015~2016年度营业状况分布图") guides(fill=guide_legend(reverse=TRUE,title=NULL)) theme_map() % replace% theme(title=element_text(family="myfont"),legend.position=c(0.08,0.4),legend.text.align=1)

倘若我想将该地图版面聚焦到中国的领土范围内,但是呢,又不想单独呈现孤零零的中国地图,我需要中国周边的这些邻国边界,来锁定中国在亚洲地区的大致位置,这些周边领国边界不要求都拥完整的行政区划,可以根据版面的需要,进行矩形切割就行。

这样看起来必须对世界地图进行切割,而且需要切割的是美学映射参数x,y的范围(也就是坐标系统的范围)。

我们都知道在ggplot2系统中,调整X,Y的标度范围拥有布置一个的可选参数:

  • xlim/ylim
  • expand_limits()
  • scale_x/y_continuous()

其实坐标轴系统中也可以嵌入标度调整参数:

  • coord_map()

那么应该使用哪个方法进行调整呢,这里就卖个关子,我们一个一个来尝试:

切割的范围为:

  • 经度:60~155
  • 维度:0~65

这个范围刚好可以涵盖我国领土的完整范围:

  • 方案一:xlim/ylim

ggplot(world_data, aes(x = long, y = lat, group = group,fill =fam)) geom_polygon(colour="white") xlim(60,155) ylim(0,65) scale_fill_brewer(palette="Blues") coord_map("polyconic") ggtitle("某公司2015~2016年度营业状况分布图") guides(fill=guide_legend(reverse=TRUE,title=NULL)) theme_map() % replace% theme(title=element_text(family="myfont"),legend.position=c(0.08,0.4),legend.text.align=1)

切割效果如下,有反馈但是效果不佳,未达到目的,第一种方案宣告失败。

  • 方案二:expand_limits()

ggplot(world_data, aes(x = long,y=lat,group=group)) geom_polygon(aes(fill =fam),colour="white") expand_limits(x=c(60,155),y=c(0,65)) scale_fill_brewer(palette="Blues") coord_map("polyconic") ggtitle("某公司2015~2016年度营业状况分布图") guides(fill=guide_legend(reverse=TRUE,title=NULL)) theme_map() % replace% theme(title=element_text(family="myfont"),legend.position=c(0.08,0.4),legend.text.align=1)

这次结果又失败了,不仅没有完成目标,底部还出现了一条莫名其妙的线条。

  • 方案三:scale_x/y_continuous()

ggplot(world_data, aes(x = long, y = lat, group = group,fill =fam)) geom_polygon(colour="white") scale_x_continuous(limits=c(60,155)) scale_y_continuous(limits=c(0,65)) scale_fill_brewer(palette="Blues") coord_map("polyconic") ggtitle("某公司2015~2016年度营业状况分布图") guides(fill=guide_legend(reverse=TRUE,title=NULL)) theme_map() % replace% theme(title=element_text(family="myfont"),legend.position=c(0.08,0.4),legend.text.align=1)

第三种方案又以失败告终,结果跟第一种的问题一模一样。

那么现在就剩最后一一种方案啦,希望这次能成功。

  • 方案四:coord_map()

ggplot(world_data,aes(x =long,y=lat,group=group,fill=fam)) geom_polygon(colour="white") scale_fill_brewer(palette="Blues") coord_cartesian(xlim=c(60,155),ylim=c(0,65)) ggtitle("某公司2015~2016年度营业状况分布图") guides(fill=guide_legend(reverse=TRUE,title=NULL)) theme_map() % replace% theme(title=element_text(family="myfont"),legend.position=c(0.88,0.3),legend.text.align=1)

ok,这次成功了,但是我放弃了使用coord_map()空间投影参数,而是使用了普通的笛卡尔二维坐标。

在ggplot2版面中制作数据对图,想要对版面进行有效的控制,需将标度范围的调整参数在坐标系内进行限定,否则会出现错乱,而是在限定范围的同时可能需要放弃使用空间投影(有没有更好的解决方案,目前还未知,留待以后解决)。

0 人点赞