矩形树状图


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

tree1.png
tree2.png
tree3.png
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()
tree5.png
# 上色

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

#注意,这里是按大小来放置,同属一个父类的子类并不在一起。
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()
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()
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")

# 由于有些父类没有子类,所以会出现标签重复,比较乱。不建议使用。保留图例更合适。
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())

tree12.png
tree13.png
tree14.png
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))
tree16.png
  • 注意:这里的图例有点乱,主要是因为没有将parent变量设置为因子类型。

配色

GIF动画流


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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,208评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,502评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,496评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,176评论 1 302
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,185评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,630评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,992评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,973评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,510评论 1 325
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,546评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,659评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,250评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,990评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,421评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,569评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,238评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,732评论 2 366