title: "treemap"
author: "wintryheart"
date: "2019/7/30"
output: html_document
knitr::opts_chunk$set(echo = TRUE)
矩形树状图
矩形树状图(treemap),是一种利用嵌套式矩形显示层次结构的方法,同时通过面积大小显示每个类别的数量。矩形树状图采用矩形表示层次结构里的节点,父子节点之间的层次关系用矩形的相互嵌套隐喻来表达。[1]
- 优点
相比传统的树形结构图,矩形树状树能更有效地利用空间,并且拥有展示占比的功能。
- 缺点
当分类占比太小的时候,文本会变得很难排布。
数据
livetree <- read.csv("c:\\users\\liang\\desktop\\gerontology\\livingtree.csv")
knitr::kable(livetree)
livetree2 <- livetree[1:12,]
knitr::kable(livetree2)
treemap包
张杰(2019)推荐直接使用treemap包的treemap()函数绘制矩形树形图。
library(treemap)
library(RColorBrewer)
treemap(livetree2, index=c("parent","familytype"), vSize = "y2010", vColor = "parent", fontcolor.labels = "black", title = "", palette = "Set1")
treemap(livetree2, index=c("parent","familytype"), vSize = "y2000", vColor = "parent", fontcolor.labels = "black", title = "", palette = "Set1")
treemap(livetree2, index=c("parent","familytype"), vSize = "y1990", vColor = "parent", fontcolor.labels = "black", title = "", palette = "Set1")
treemap(livetree2, index=c("parent","familytype"), vSize = "y1982", vColor = "parent", fontcolor.labels = "black", title = "", palette = "Set1")
- 数据集livetree中,parent变量代表父类别,familytype代表子类别。
- 不晓得为什么,我尝试各种方法,都没办法把这四张图整合成一张图输出。
- par()和layout()设置似乎对它无效。grid.arrange()不支持它。
treemapify包
- 张杰(2019)提到这个包,但是可能他用的版本比较低,所以用起来很麻烦。
- treemapify包是ggplot2的扩展包,提供geom_treemap()、geom_treemap_text()函数进行构图。
- 如果涉及父子嵌套,可用函数geom_treemap_subgroup_border()、geom_treemap_subgroup_text()等函数构图。
library(ggplot2)
library(treemapify)
library(RColorBrewer)
#构基本矩形框图
ggplot(livetree2, aes(area=y2010)) +geom_treemap()
# 上色
ggplot(livetree2, aes(area=y2010, fill=parent))+geom_treemap()
# 单色
# 注意这里填充颜色的变量parent是离散型分类变量
ggplot(livetree2, aes(area=y2010, fill=parent))+geom_treemap()+ scale_fill_brewer(palette="Greens")
# 如果填充颜色的变量是连续型变量,用scale_fill_distiller()
# ggplot(livetree2, aes(area=y2010, fill=parent))+geom_treemap()+ scale_fill_distiller(palette="Greens")
# 添加标签
# 注意,这里我用父类填充颜色,用子类作为标签。
ggplot(livetree2, aes(area=y2010, fill=parent, label=familytype))+geom_treemap()+ scale_fill_brewer(palette="Greens") + geom_treemap_text()
#注意,这里是按大小来放置,同属一个父类的子类并不在一起。
# 分群
# 注意,在treemapify的设计中,subgroup代表更高的父类。
ggplot(livetree2, aes(area=y2010, fill=parent, label=familytype, subgroup=parent))+geom_treemap()+ scale_fill_brewer(palette="Greens") +geom_treemap_text() +geom_treemap_subgroup_border()
# 多色系
ggplot(livetree2, aes(area=y2010, fill=parent, label=familytype, subgroup=parent))+geom_treemap()+ scale_fill_brewer(palette="Set2") +geom_treemap_text() +geom_treemap_subgroup_border()
# 添加父类标签
ggplot(livetree2, aes(area=y2010, fill=parent, label=familytype, subgroup=parent)) +
geom_treemap() +
scale_fill_brewer(palette="Set2") +
geom_treemap_text() +
geom_treemap_subgroup_border() +
geom_treemap_subgroup_text(place = "centre", colour="red")
# 由于有些父类没有子类,所以会出现标签重复,比较乱。不建议使用。保留图例更合适。
ggplot(livetree2, aes(area=y1982, fill=parent, label=familytype, subgroup=parent)) +
geom_treemap() +
geom_treemap_text() +
geom_treemap_subgroup_border() +
theme(legend.title = element_blank())
ggplot(livetree2, aes(area=y1990, fill=parent, label=familytype, subgroup=parent)) +
geom_treemap() +
geom_treemap_text() +
geom_treemap_subgroup_border() +
theme(legend.title = element_blank())
ggplot(livetree2, aes(area=y2000, fill=parent, label=familytype, subgroup=parent)) +
geom_treemap() +
geom_treemap_text() +
geom_treemap_subgroup_border() +
theme(legend.title = element_blank())
ggplot(livetree2, aes(area=y2010, fill=parent, label=familytype, subgroup=parent)) +
geom_treemap() +
geom_treemap_text() +
geom_treemap_subgroup_border() +
theme(legend.title = element_blank())
- 奇怪的是gridExtra包中的grid.arrange()函数仍不支持合并上面用treemapify拓展包做出来的图。
- 还好,可以用ggplot2分面来做。
# 分面
# 重置数据由宽表变长表
library(tidyverse)
library(reshape2)
livetree3 <- melt(livetree2, id.vars=c("id", "familytype", "parent"), variable.name="year",value.name = "proportion")
livetree3$year <- str_replace(livetree3$year, "y", "")
# 根据年份添加分面
ggplot(livetree3, aes(area=proportion, fill=parent, label=familytype, subgroup=parent)) +
geom_treemap() +
geom_treemap_text() +
geom_treemap_subgroup_border() +
theme(legend.title = element_blank()) +
facet_wrap(~year) +
labs(title = "中国老人家庭类型变迁") +
theme(legend.position = "bottom", plot.title = element_text(hjust=0.5))
- 注意:这里的图例有点乱,主要是因为没有将parent变量设置为因子类型。
配色
- 配色方案大致可以分为三类:单色系、多色系和双色渐变系。
- 配色主题方案可参考:
- ColorBrewer2.0
- RColorBrewer包的颜色主题方案
- 张杰(2019)书的第67页。
GIF动画流
EasyCharts的博文终于等到你:ggplot2树状图 介绍了通过tweenr包和gganimate包来做动图的方案。[2] 但是我没有做成功。提示命令过时。
gganimate使用说明
-
张杰,《R语言数据可视化之美:专业图表绘制指南》,电子工业出版社,2019。 ↩
-
张杰就是EasyCharts的主创。书的内容赶不上软件包的更新,多注意公众号的最新内容。 ↩