是時候展現真正的技術了——動態人口結構金字塔變化圖(R語言+Excel)
最近更新的頻率越來越少了,因為我個人原因,各種事情在忙,實在對不起大家,今天寫一篇補償一下~
既然寫的少了,那麼以後每寫一篇,都會讓技術含量高一些,這樣才能對得起大家的期待~今天這篇分享我國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
更多信息敬請查看: http://easychart.github.io/post/Easycharts/
推薦閱讀:
※Excel如何篩選連續重複的數據
※《PowerBI大師》使用手冊
※DAX數據建模終極指南
※學習筆記|圓環圖的分離程度和內徑大小是什麼,有何作用?
※財經拋物線
TAG:MicrosoftExcel |