玩轉數據地圖系列之——地圖上的迷你條形圖
最近忙的厲害,產量下降的有點嚴重,感謝各位還沒取關的小夥伴兒。
一周前更新了一篇數據地圖上的氣泡散點圖的內容,不知怎地,這段時間就是跟地圖死磕上了,今天還是數據地圖,不過是在數據地圖上呈現條形圖、柱形圖。
之前的一篇因為有現成的作圖包支持,geom_scatterpie函數不用花費太大力氣就解決了數據地圖上的氣泡散點圖問題。
可是到目前為止我還沒有發現支持對應坐標位置的條形圖、柱形圖,這一篇是參考了知乎上大神提供的思路。
載入包:
library(maptools)nlibrary(ggplot2)nlibrary(plyr)nlibrary(ggmap)n
導入地圖素材及省會城市經緯度數據
china_shp <-readShapePoly("c:/rstudy/bou2_4p.shp") nchina_map <- fortify(china_shp) nprovince_city <- read.csv("c:/rstudy/chinaprovincecity.csv") #城市經緯度數據 n
#新建三個指標,2015年和2016年的某經濟度量指標(虛構)N15、N16和環比增長率Ratio。
province_city1<-mutate(province_city,N15=runif(34,min=500,max=1000),N16=runif(34,600,1100),Ratio=round((N16-N15)/N15,3))nprovince_data<-province_city1[sample(nrow(province_city1),10),]n
合併後的數據結構如下,隨即選取了10個城市的14、15年度某項經濟指標(虛構)以及同比增長率。
ggplot的現有圖層圖形中是沒有直接根據點坐標生成條形圖、柱形圖的,所以這裡我們只能曲線救國,使用線條圖和誤差線來進行模擬。
首先來畫底圖:
ggplot()+ngeom_polygon(aes(x=long, y=lat, group=group), data=china_map, fill="white", colour="grey60")n
接下來使用geom_linerange函數(也就是條線圖函數)進行各個坐標點的模擬柱形繪製。
先畫出14年的指標值:
ggplot()+ngeom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+ngeom_linerange(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+N15/max(N15,N16)*5),size=5,color="orange",alpha=0.8)n
再疊加一次16年的指標值
ggplot()+ngeom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+ngeom_linerange(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+0.7*N15/max(N15,N16)*5),size=3,color="#5B88A0",alpha=0.8)+ngeom_linerange(data=province_data,aes(x=jd+0.5,ymin=wd,ymax=wd+0.7*N16/max(N15,N16)*5),size=3,color="#FB882C",alpha=0.8)n
接下來我們來對已經塑造好的雙柱條形圖進行美化操作,
windowsFonts(myFont = windowsFont("微軟雅黑")) nggplot()+ngeom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+ngeom_linerange(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+0.7*N15/max(N15,N16)*5),size=3,color="#5B88A0",alpha=0.8)+ngeom_linerange(data=province_data,aes(x=jd+0.5,ymin=wd,ymax=wd+0.7*N16/max(N15,N16)*5),size=3,color="#FB882C",alpha=0.8)+ngeom_text(aes(x=jd,y=wd-0.6,label=paste0(province_data$province,ifelse(Ratio>0,"▲","▼"),Ratio*100,"%")), data=province_data,family="myFont",size=2.5)+ntheme_nothing()+nannotate("text", x=105, y=52, label="● 2015", color= "#5B88A0", size=8)+ nannotate("text", x=105, y=49, label="● 2016", color= "#FB882C", size=8)n
其實最初在網上看到該圖(大概是劉萬祥老師的博客,在此感謝老師的啟發),他的做法是使用geom_errbar圖層函數,也就是誤差線圖層函數,其實理念是一致的。這裡給出原方法。
ggplot()+ngeom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+ngeom_errorbar(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+0.7*N15/max(N15,N16)*5),size=3,color="#5B88A0",width_=0,alpha=0.8)+ngeom_errorbar(data=province_data,aes(x=jd+0.5,ymin=wd,ymax=wd+0.7*N16/max(N15,N16)*5),size=3,color="#FB882C",width_=0,alpha=0.8)+ngeom_text(aes(x=jd,y=wd-0.6,label=paste0(province_data$province,ifelse(Ratio>0,"▲","▼"),Ratio*100,"%")), data=province_data,family="myFont",size=2.5)+ntheme_nothing()+nannotate("text", x=105, y=52, label="● 2014", color= "#5B88A0", size=8)+ nannotate("text", x=105, y=49, label="● 2015", color= "#FB882C", size=8)n
其實如果能換個思路,使用geom_errorh函數,想必一定了以做出橫向的條形圖。
ggplot()+ngeom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+ngeom_errorbarh(data=province_data,aes(x=jd,y=wd,xmin=jd-3,xmax=jd+3*N15/max(N15,N16)),size=3,color="#5B88A0",height=0,alpha=0.8)+ngeom_errorbarh(data=province_data,aes(x=jd,y=wd-0.8,xmin=jd-3,xmax=jd+3*N16/max(N15,N16)),size=3,color="#FB882C",height=0,alpha=0.8)+ngeom_text(aes(x=jd+0.2,y=wd+1,label=paste0(province_data$province,ifelse(Ratio>0,"▲","▼"),Ratio*100,"%")), data=province_data,family="myFont",size=2.5)+ntheme_nothing()+nannotate("text", x=105, y=52, label="● 2015", color= "#5B88A0", size=7)+ nannotate("text", x=105, y=50, label="● 2016", color= "#FB882C", size=7)n
聯繫方式:
wechat:ljty1991
Mail:578708965@qq.com 個人公眾號:數據小魔方(datamofang) 團隊公眾號:EasyCharts qq交流群:[魔方學院]553270834推薦閱讀:
※R語言可視化——ggplot繪製中心密度輻射圖
※翻譯-Reshaping Data in R
※初探密碼破譯:Metropolis-Hastings演算法破解密文
※在《one.一個》改版前,你一直念念不忘的文章是哪篇?
※R語言分析告訴你應避開哪個國家以躲避空難