终于等到你——ggplot2树状图

2017 年 12 月 2 日 R语言中文社区 杜雨

杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。


2017年8月份的R语言更新包中,默默地加入了支持ggplot2树状图的新几何对象,从此在R语言中制作树状图,不用再求助于第三方包的辅助了。


该包既有Cran上的正式发行版,也有托管在GitHub上的开发版,安装方式如下:


CRAN:

install.package("treemapify")

Github:

devtools::install_github("wilkox/treemapify")


GitHub主页:

https://github.com/wilkox/treemapify


载入本文章所需的扩展包:

library("ggplot2")

library("treemapify")

library("tweenr")

library("gganimate")

library("RColorBrewer")


安装该包之后,你的ggplot2中会多出一个树状图几何对象——geom_treemap()。


本次案例使用该(treemapify)包内的内置数据集:


预览一下数据集结构:


str(G20)

head(G20)



该数据集描述20峰会参会国家的经济指标,里面包含了五个字段,分别是全球的大区(region)、国家名称(country)、GDP指标(gdp_mil_usd)(应该是二次计算的某种指标),人类发展指数(hdi),已经经济发展程度(econ_classification)。


字段名称               类型

region                 因子型

country                因子型

gdp_mil_usd        数值型(整数)

hdi                        数值型(浮点)

econ_classification    因子型



树状图是没有显式坐标系统的一类特殊图形,依靠正方化算法,将样本总体正方形按照实际观测值占总体比例分割成单个矩形方块。因而其至少需要一个数值型变量作为输入参数。


一个简单的树状图:


ggplot(G20, aes(area = gdp_mil_usd)) + 

  geom_treemap()




因为area仅仅是定义了一个数值型变量的方块大小,填充颜色是可以单独定义的。但是颜色往往也可以单独作为一个数值型度量的表达方式。


ggplot(G20, aes(area = gdp_mil_usd)) + 

  geom_treemap(fill="steelblue")



ggplot(G20, aes(area = gdp_mil_usd, fill = hdi)) + 

  geom_treemap()+

  scale_fill_distiller(palette="Greens")



添加标签:


包作者针对ggplot树状图写了优化好的文本 标签函数geom_treemap_text(刚开始就说过树状图超越了传统三大坐标系的范畴,没有显式声明的坐标系统,算法比较特殊因而无法使用常规的geom_text()进行添加标签)。


ggplot(G20, aes(area = gdp_mil_usd, fill = hdi, label = country)) +

  geom_treemap() +

  geom_treemap_text(fontface = "italic", colour = "red", place = "centre",grow = TRUE,alpha=.6)+

  scale_fill_distiller(palette="Greens")



其中place参数控制每一个方块中标签相对于四周的位置,grow则控制标签是否与方块大小自适应(呈大致比例放大缩小)


次级分组(亚群):


该包支持次级分组(专业术语叫做亚群),这在实际应用场景中非常广泛,比如我们在观察国家指标大小的同时,还想获取国家所属大区的总体指标,通过加入次级分组,我们可以获取两个维度信息。通过在美学映射中设置subgroup参数(一个类别型变量),函数内部可以自动完成亚群的变量聚合计算,并在图形成用框线显示出次级类别大小的规模。


ggplot(G20, aes(area = gdp_mil_usd, fill = hdi, label = country,subgroup = region)) +

  geom_treemap() +

  geom_treemap_subgroup_border() +

  geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5, colour ="black", fontface = "italic", min.size = 0) +

  geom_treemap_text(colour = "red", place = "topleft", reflow = T,alpha=.5)+

  scale_fill_distiller(palette="Greens")



其中reflow参数用于控制标签是否自适应矩形块大小,若按照原始大小超过矩形块,则会自动换行显示。


分面系统:


当你觉得使用次级分组不能获得一个很好地视觉呈现效果,geom_treemap还支持ggplot函数中的fact_grid分面参数,这就是所有ggplot2扩展函数的好处,可以继承源自于ggplot2的高级图形属性。


ggplot(G20, aes(area = gdp_mil_usd, fill = region, label = country)) +

  geom_treemap() +

  geom_treemap_text(grow = T, reflow = T, colour = "black") +

  facet_wrap( ~ econ_classification) +

  scale_fill_brewer(palette="Blues")+

  labs(

 title = "The G-20 major economies",

caption = "The area of each country is proportional to its relative GDP within the economic group (advanced or developing)",

 fill = "Region" )+

theme(legend.position = "bottom",

plot.caption=element_text(hjust=0)) 



GIF动画流:


借助tweened包提供的差值方法,你可以实现将不同时间点的截面数据进行追加,并且编组成gganimate函数可识别的动画帧组,通过tweenlength、statelength和nframes 参数来控制变化的长度、每一帧停留的时间以及切换的帧数。


G20_alt <- G20

G20_alt$gdp_mil_usd <- sample(G20$gdp_mil_usd, nrow(G20))

G20_alt$hdi <- sample(G20$hdi, nrow(G20))

tweened <- tween_states(list(G20,G20_alt,G20), tweenlength = 8, statelength = 5, ease = 'cubic-in-out', nframes = 30)


animated_plot <- ggplot(tweened, aes(area = gdp_mil_usd, fill = hdi,label = country, subgroup = region,frame = .frame)) +

  geom_treemap(fixed = T) +

  geom_treemap_subgroup_border(fixed = T) +

  geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5,colour = "black", fontface = "italic", min.size = 0,fixed = T) +

  geom_treemap_text(colour = "white", place = "topleft", reflow = T, fixed = T)+

  scale_fill_distiller(palette="Greens")


ani.options(interval = 1/10)

gganimate(animated_plot, "E:/animated_treemap.gif", title_frame = F,ani.width = 1000, ani.height = 800)



treemapify包给ggplot2提供的geom_treemap(),填补了ggplot2原生几何对象在树状图领域的空白,可谓是进一步扩展、丰富ggplot2生态系统。


参考文献:

https://github.com/thomasp85/tweenr

https://github.com/wilkox/treemapify


在线课程请点击文末原文链接:

往期案例数据请移步本人GitHub:

https://github.com/ljtyduyu/DataWarehouse/tree/master/File


公众号后台回复关键字即可学习

回复 R               R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

登录查看更多
0

相关内容

【2020新书】从Excel中学习数据挖掘,223页pdf
专知会员服务
90+阅读 · 2020年6月28日
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
113+阅读 · 2020年5月24日
【Manning新书】现代Java实战,592页pdf
专知会员服务
99+阅读 · 2020年5月22日
【经典书】Python计算机视觉编程,中文版,363页pdf
专知会员服务
139+阅读 · 2020年2月16日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
179+阅读 · 2020年1月1日
Cayley图数据库的可视化(Visualize)
Python开发者
5+阅读 · 2019年9月9日
OpenCV 3.0 三年半后,OpenCV 4.0 终于出炉
Python开发者
5+阅读 · 2018年12月1日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
【入门】数据分析六部曲
36大数据
18+阅读 · 2017年12月6日
shiny动态仪表盘应用 | 中国世界自然文化遗产可视化案例
R语言中文社区
10+阅读 · 2017年11月29日
ggstance:ggplot2的水平版本
R语言中文社区
5+阅读 · 2017年11月17日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Arxiv
101+阅读 · 2020年3月4日
VIP会员
相关VIP内容
相关资讯
Cayley图数据库的可视化(Visualize)
Python开发者
5+阅读 · 2019年9月9日
OpenCV 3.0 三年半后,OpenCV 4.0 终于出炉
Python开发者
5+阅读 · 2018年12月1日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
【入门】数据分析六部曲
36大数据
18+阅读 · 2017年12月6日
shiny动态仪表盘应用 | 中国世界自然文化遗产可视化案例
R语言中文社区
10+阅读 · 2017年11月29日
ggstance:ggplot2的水平版本
R语言中文社区
5+阅读 · 2017年11月17日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Top
微信扫码咨询专知VIP会员