前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >是时候展现真正的技术了——让你的图表舞动起来~

是时候展现真正的技术了——让你的图表舞动起来~

作者头像
数据小磨坊
发布2018-04-11 16:42:05
7350
发布2018-04-11 16:42:05
举报
文章被收录于专栏:数据小魔方数据小魔方

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

既然写的少了,那么以后每写一篇,都会让技术含量高一些,这样才能对得起大家的期待~今天这篇分享我国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来制作:

视频内容

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档