標籤:

是時候展現真正的技術了——動態人口結構金字塔變化圖(R語言+Excel)

2017-05-03 杜雨 EasyCharts

最近更新的頻率越來越少了,因為我個人原因,各種事情在忙,實在對不起大家,今天寫一篇補償一下~

既然寫的少了,那麼以後每寫一篇,都會讓技術含量高一些,這樣才能對得起大家的期待~今天這篇分享我國1950~2015年的人口年齡段分布圖(分性別),數據是從UN的人口資料庫中拿到的,相信有一定的權威性。

好吧先上圖:

這是我最初看到的版本:感覺很有趣,就自己去找了數據從新的做的:

這個是我自己使用R語言做的:

因為UN的資料庫中沒有年度的人口結構(分性別數據),之前看到過一個美國政府的統計數據有年度數據,但是因為外網沒法註冊,實在是遺憾,只能用這個5年間隔額數據了。

以下數據整個圖表的代碼部分:

library(ggplot2)

library(animation)

library(dplyr)

library(tidyr)

library(xlsx)

library(ggthemes)

female<-read.xlsx("Population.xlsx",sheetName="Female",header=T,encoding=UTF-8,check.names = FALSE)

male<-read.xlsx("Population.xlsx",sheetName="Male",header=T,encoding=UTF-8,check.names = FALSE)

female<-female%>%gather(Year,Poputation,-1)

male<-male%>%gather(Year,Poputation,-1)

female$Poputation<-female$Poputation*-1

male$sex<-"male";female$sex<-"female"

China_Population<-rbind(male,female)%>%mutate(abs_pop=abs(Poputation))

China_Population$agegroup<-factor(China_Population$agegroup,

levels=c("0-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74","75-79","80+") ,order=T)

m<-seq(1950,2015,by=5)

saveGIF({

for (i in m) {

title <- as.character(i)

year_data <- filter(China_Population,Year==i)

g1<-ggplot(year_data,aes(x =agegroup,y=Poputation,fill=sex,width_=1)) +

coord_fixed()+

coord_flip() +

geom_bar(data=subset(year_data,sex=="female"),stat = "identity") +

geom_bar(data=subset(year_data,sex=="male"), stat = "identity") +

scale_y_continuous(breaks = seq(-70000,70000,length=9),

labels = paste0(as.character(c(abs(seq(-70,70,length=9)))), "m"),

limits = c(-75000, 75000)) +

theme_economist(base_size = 14) +

scale_fill_manual(values = c(#D40225, #374F8F)) +

labs(title=paste0("Population structure of China:", title),

caption="Data Source:United Nations Department of Economic and Docial AffairsnPopulation DivisionnWorld Population Prospects,the 2015 Revision"

,y="Population",x="Age") +

guides(fill=guide_legend(reverse = TRUE))+

theme(

legend.position =c(0.8,0.9),

legend.title = element_blank(),

plot.title = element_text(size=20),

plot.caption = element_text(size=12,hjust=0),

)

print(g1)

}

},movie.name=japan_pyramid.gif,interval=0.5,ani.width_=700,ani.height=600)

其實代碼部分並不是很難,主要是前期數據整理比較耗時,還有使用到謝益輝大神寫的動畫製作包(animation)。而且我相信如果是第一次運行此段代碼,估計大部分人都無法運行成功。

因為這個包依賴一個動畫軟體:ImageMagick,該軟體安裝起來相當費事,自己倒騰了半天,找各種教程,最後總算成功了。

R_animation包_saveGIF函數_Wancius_新浪博客

按照這裡的安裝步驟,安裝完成之後,把安裝目錄路徑寫入環境變數,最後就開始盡情表演吧~

有了這些原始數據,當然你也可以在Excel裡面使用控制項或者VBA來製作:

詳細步驟呢,這裡就不提示了,Excel的控制項和函數相對比較簡單,以上案例所使用到的技術無非就是 OFFSET、MATCH函數,窗體控制項、動態名稱管理器等工具,案例中我是寫了一個VBA小程序(用來切換動態數據源),雖然可以正常切換數據源,但是圖表卻無法實時更新(只是切換到最後一個年份更新了一次,後來通過請教各種VBA大神才知道,可能是Excel自身存在的bug,然後 用Excel2013、2010試了一下VBA是可以正常實現自動更新的),很遺憾本來想用VBA裝逼來著,結果失敗了~_~

不過所使用的數值調節器是可以正常工作的!左側圖表使用的是普通的控制項+offset函數方法,右側圖表使用的是動態名稱管理器+offset函數,這些內容我在一年前的公眾號裡面已經總結的非常體系化了,不懂得可以去看!

數據文件呢,還是老規矩,入群下載:

歡迎關注魔方學院QQ群

EasyCharts團隊出品

帥的人都關注了EasyCharts團隊^..^~

QQ交流群:553270834

微信公眾號:EasyCharts

更多信息敬請查看: easychart.github.io/pos

推薦閱讀:

Excel如何篩選連續重複的數據
《PowerBI大師》使用手冊
DAX數據建模終極指南
學習筆記|圓環圖的分離程度和內徑大小是什麼,有何作用?
財經拋物線

TAG:MicrosoftExcel |