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

浏览: 2735

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

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

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

image.png

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)

image.png

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

这样看起来必须对世界地图进行切割,而且需要切割的是美学映射参数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)

image.png

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

  • 方案二: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)

image.png

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

  • 方案三: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)

image.png

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

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

  • 方案四: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)

image.png

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

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

欢迎关注魔方学院QQ群


推荐 0
本文由 EasyCharts 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册