是时候展现真正的技术了——让你的图表舞动起来~
作者:杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。
个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。
最近更新的频率越来越少了,因为我个人原因,各种事情在忙,实在对不起大家,今天写一篇补偿一下~
既然写的少了,那么以后每写一篇,都会让技术含量高一些,这样才能对得起大家的期待~今天这篇分享我国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 Affairs\nPopulation Division\nWorld 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,该软件安装起来相当费事,自己倒腾了半天,找各种教程,最后总算成功了。
http://blog.sina.com.cn/s/blog_a7b297ed0102wqer.html
按照这里的安装步骤,安装完成之后,把安装目录路径写入环境变量,最后就开始尽情表演吧~
有了这些原始数据,当然你也可以在Excel里面使用控件或者VBA来制作:
https://v.qq.com/txp/iframe/player.html?vid=a1316nwvw7b&width=500&height=375&auto=0
详细步骤呢,这里就不提示了,Excel的控件和函数相对比较简单,以上案例所使用到的技术无非就是 OFFSET、MATCH函数,窗体控件、动态名称管理器等工具,案例中我是写了一个VBA小程序(用来切换动态数据源),虽然可以正常切换数据源,但是图表却无法实时更新(只是切换到最后一个年份更新了一次),很遗憾本来想用VBA装逼来着,结果失败了~_~
不过所使用的数值调节器是可以正常工作的!左侧图表使用的是普通的控件+offset函数方法,右侧图表使用的是动态名称管理器+offset函数,这些内容我在一年前的公众号里面已经总结的非常体系化了,不懂得可以去看!
快报:杜雨2017年09月12在Hellobi Live直播【R语言可视化在商务场景中的应用】
内容:1、为什么选择R;2、ggplot2可视化理念;3、配色方案与规则;4、案例分享;5、高级数据地图专题应用;6、图形输出。
点击阅读原文立即学习+扫码咨询