查看原文
其他

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

2017-07-11 杜雨 R语言中文社区

 作者:杜雨,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、图形输出。

点击阅读原文立即学习+扫码咨询

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存