數據地圖亟待解決的棘手問題~
今天跟大家分享三個數據地圖的遺留問題,包括以前因為技術手段限制無法解決的問題,以及讀者吐槽最多的問題。
如何在一個版面上呈現不同行政級別的地理信息;
如何給版面添加mini導航定位窗口;
關於九段線問題。
關於第一個問題的解決方案,其實很簡單,就是通過兩個不同行政級別的圖層進行疊加來達到目的。
library(maps) nlibrary("ggplot2")nlibrary("ggthemes")nlibrary("dplyr")nlibrary("maptools")nlibrary("grid")nlibrary("ggimage")n
world_map<-map_data("world")ndata<-read.csv("D:/R/mapdata/Word_State.csv",stringsAsFactors = FALSE,check.names = FALSE) ndata1<-filter(data,region=="Russia" | Address=="Asia")nmymapdata<-merge(world_map[,1:5],data1,type="right")%>%filter(long>=30 & lat>=10)%>%arrange(group,order)n
#底層的區域地圖:nggplot(mymapdata)+ngeom_polygon(aes(x=long,y=lat,group=group),fill="grey95",col="black")+ncoord_map("polyconic") +ntheme_map() n
#表層的中國省級行政區劃地圖:nchina_map <- readShapePoly("D:/R/rstudy/CHN_adm/bou2_4p.shp") nchina_map1 <- fortify(china_map) n
ggplot(china_map1)+ngeom_polygon(aes(x=long,y=lat,group=group),fill="white",col="black")+ncoord_map("polyconic") +ntheme_map() n
#將兩個圖層對象放在同一個圖形對象中(注意先後順序)。
ggplot()+ngeom_polygon(data=mymapdata,aes(x=long,y=lat,group=group),fill="grey95",col="grey")+ngeom_polygon(data=china_map1,aes(x=long,y=lat,group=group),fill="white",col="black")+ncoord_map("polyconic") +ntheme_map() n
第二個問題,關於minimini導航窗口。
其實這個問題多少跟第一個問題有些關聯,也是旨在給我們要呈現的中心地圖一個區域定位的作用。解決方案依然是拼圖,不過這次是拼的圖表(整個圖表對象),而非圖表中的圖層。
#位於中間的中國行政區劃地圖:np1<-ggplot()+ngeom_polygon(data=china_map1,aes(x=long,y=lat,group=group),fill="white",col="grey")+ncoord_map("polyconic") +ntheme_map();p1n
p2<-ggplot()+ngeom_polygon(data=world_map,aes(x=long,y=lat,group=group),fill="grey95",col="grey")+nannotate(geom="rect",xmin =30, xmax =155,ymin =10L, ymax = 55,colour="grey",fill="orange",alpha=.3)+ntheme_map() %+replace% theme(plot.background=element_rect(colour="black"));p2n
#拼貼合併:nvie<-viewport(width_=0.30,height=0.25,x=0.25,y=0.25)np1;print(p2,vp=vie)n
第三個問題;也是被吐槽最多的九段線問題,這個問題,其實嚴格來說,我也沒有辦法搞定。
一般的九段線標識方法有兩種,一種是在實際位置框定九段線範圍,另一種則是將九段線的實際範圍單獨移至版面的邊緣位置。第一種方法需要精確的九段線經緯點數據,獲取不易,第二種則九段線位置過於靈活,然後不好掌握數據。
如果你能獲取帶有九段線數據的地圖素材,那麼這是最佳的解決方案,倘若不行,我們就要對圖表後期進行處理(大部分人想到的方法是使用PS等軟體,當然 這也是一種解決方案,至少清晰度上可以保證)。
但是既然是在R裡面寫代碼,突然跑去玩PS總感覺怪怪的,能用代碼解決的問題就不算問題,沒錯拼圖嘛,R依然搞的定。
首先你要有個九段線素材圖片。
jiuduanxian<-"E:/數據可視化/R/R語言學習筆記/可視化/timg.jpg"nggplot()+ngeom_polygon(data=china_map1,aes(x=long,y=lat,group=group),fill="white",col="grey")+ngeom_image(aes(image=jiuduanxian,x=130,y=20),size=.2)+ncoord_map("polyconic") +ntheme_map()n
我找的這個九段線素材可能跟中國地圖風格搭配的不是很好,當然各位使用的時候可以自己去找相對準確、美觀的素材使用。
最後提醒大家,關於九段線問題,一定要在報告或者文章末尾進行免責聲明,涉及到領土爭端問題,不僅僅要意識到,而且要儘可能的做好應對措施,避免不必要的麻煩。
點擊rainduhome 進入本人博客,所有文章均會在博客同步更新,博客內可直接跳轉GitHub主頁,直達所有案例數據倉庫。(也可進入交流群獲取案例數據)
聯繫方式:
微信:ljty1991
博客主頁:raindus home
個人公眾號:數據小魔方(datamofang)
團隊公眾號:EasyCharts
qq交流群:[魔方學院]298236508
推薦閱讀:
※如何在地圖上管理餐飲連鎖店信息
※今天再來談談REmap包
※關於地圖的清單
※如何下載 50 年前自己家鄉的高清衛星照片
※中國村莊名稱尾字圖