矩形树状图


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")

矩形树状图_第1张图片
tree1.png
矩形树状图_第2张图片
tree2.png
矩形树状图_第3张图片
tree3.png
矩形树状图_第4张图片
tree4.png
  • 数据集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()
矩形树状图_第5张图片
tree5.png
# 上色

ggplot(livetree2, aes(area=y2010, fill=parent))+geom_treemap()
矩形树状图_第6张图片
tree6.png
# 单色

# 注意这里填充颜色的变量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")
矩形树状图_第7张图片
tree7.png
# 添加标签
# 注意,这里我用父类填充颜色,用子类作为标签。
ggplot(livetree2, aes(area=y2010, fill=parent, label=familytype))+geom_treemap()+ scale_fill_brewer(palette="Greens") +   geom_treemap_text()

#注意,这里是按大小来放置,同属一个父类的子类并不在一起。
矩形树状图_第8张图片
tree8.png
# 分群
# 注意,在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()
矩形树状图_第9张图片
tree9.png
# 多色系
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()
矩形树状图_第10张图片
tree10.png
# 添加父类标签

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")

# 由于有些父类没有子类,所以会出现标签重复,比较乱。不建议使用。保留图例更合适。
矩形树状图_第11张图片
tree11.png
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())

矩形树状图_第12张图片
tree12.png
矩形树状图_第13张图片
tree13.png
矩形树状图_第14张图片
tree14.png
矩形树状图_第15张图片
tree15.png
  • 奇怪的是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))
矩形树状图_第16张图片
tree16.png
  • 注意:这里的图例有点乱,主要是因为没有将parent变量设置为因子类型。

配色

  • 配色方案大致可以分为三类:单色系、多色系和双色渐变系。
  • 配色主题方案可参考:
    • ColorBrewer2.0
    • RColorBrewer包的颜色主题方案
    • 张杰(2019)书的第67页。

GIF动画流

  • EasyCharts的博文终于等到你:ggplot2树状图 介绍了通过tweenr包和gganimate包来做动图的方案。[2] 但是我没有做成功。提示命令过时。

  • gganimate使用说明


  1. 张杰,《R语言数据可视化之美:专业图表绘制指南》,电子工业出版社,2019。 ↩

  2. 张杰就是EasyCharts的主创。书的内容赶不上软件包的更新,多注意公众号的最新内容。 ↩

你可能感兴趣的:(矩形树状图)