专栏名称: EasyCharts
EasyCharts,易图表,我们将定期推送各种数据可视化与分析教程,包括Excel(Power BI)、Origin、Sigmaplot、GraphPad、R、Python、Matlab、Tableau、D3.js等。
目录
相关文章推荐
前端早读课  ·  【早阅】适配器和组合设计模式 ·  昨天  
言鼎动作学苑  ·  FMS课堂实录-张丹玥 | FMS 筛查的次数 ·  3 天前  
言鼎动作学苑  ·  FMS课堂实录-张丹玥 | FMS 筛查的次数 ·  3 天前  
前端之巅  ·  快手前端动效大揭秘:告别低效,vision平 ... ·  5 天前  
前端大全  ·  两款知名国产前端开源项目被“投毒” ·  5 天前  
奇舞精选  ·  小型 Vue 项目,该不该用 Pinia ... ·  5 天前  
51好读  ›  专栏  ›  EasyCharts

是时候展现真正的技术了——动态人口结构金字塔变化图(R语言+Excel)

EasyCharts  · 公众号  · 前端  · 2017-05-03 08:33

正文

最近更新的频率越来越少了,因为我个人原因,各种事情在忙,实在对不起大家,今天写一篇补偿一下~


既然写的少了,那么以后每写一篇,都会让技术含量高一些,这样才能对得起大家的期待~今天这篇分享我国1950~2015年的人口年龄段分布图(分性别),数据是从UN的人口数据库中拿到的,相信有一定的权威性。


好吧先上图:


这是我最初看到的版本:感觉很有趣,就自己去找了数据从新的做的:




这个是我自己使用R语言做的:



因为UN的数据库中没有年度的人口结构(分性别数据),之前看到过一个美国政府的统计数据有年度数据,但是因为外网没法注册,实在是遗憾,只能用这个5年间隔额数据了。


以下数据整个图表的代码部分:


library(ggplot2)

library(animation)

library(dplyr)

library(tidyr)

library(xlsx)

library(ggthemes)


female

male


female%gather(Year,Poputation,-1)

male%gather(Year,Poputation,-1)

female$Poputation


male$sex


China_Population%mutate(abs_pop=abs(Poputation))

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


saveGIF({

  for (i in m) { 

    title

    year_data

     g1

        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来制作:





详细步骤呢,这里就不提示了,Excel的控件和函数相对比较简单,以上案例所使用到的技术无非就是 OFFSET、MATCH函数,窗体控件、动态名称管理器等工具,案例中我是写了一个VBA小程序(用来切换动态数据源),虽然可以正常切换数据源,但是图表却无法实时更新(只是切换到最后一个年份更新了一次,后来通过请教各种VBA大神才知道,可能是Excel自身存在的bug,然后 用Excel2013、2010试了一下VBA是可以正常实现自动更新的),很遗憾本来想用VBA装逼来着,结果失败了~_~


不过所使用的数值调节器是可以正常工作的!左侧图表使用的是普通的控件+offset函数方法,右侧图表使用的是动态名称管理器+offset函数,这些内容我在一年前的公众号里面已经总结的非常体系化了,不懂得可以去看!


数据文件呢,还是老规矩,入群下载:


欢迎关注魔方学院QQ群