title: "treemap"
author: "wintryheart"
date: "2019/7/30"
output: html_document
knitr::opts_chunk$set(echo = TRUE)
矩形樹(shù)狀圖
矩形樹(shù)狀圖(treemap),是一種利用嵌套式矩形顯示層次結(jié)構(gòu)的方法,同時(shí)通過(guò)面積大小顯示每個(gè)類別的數(shù)量侥袜。矩形樹(shù)狀圖采用矩形表示層次結(jié)構(gòu)里的節(jié)點(diǎn)战秋,父子節(jié)點(diǎn)之間的層次關(guān)系用矩形的相互嵌套隱喻來(lái)表達(dá)。[1]
- 優(yōu)點(diǎn)
相比傳統(tǒng)的樹(shù)形結(jié)構(gòu)圖漂坏,矩形樹(shù)狀樹(shù)能更有效地利用空間诸典,并且擁有展示占比的功能跪帝。
- 缺點(diǎn)
當(dāng)分類占比太小的時(shí)候今膊,文本會(huì)變得很難排布。
數(shù)據(jù)
livetree <- read.csv("c:\\users\\liang\\desktop\\gerontology\\livingtree.csv")
knitr::kable(livetree)
livetree2 <- livetree[1:12,]
knitr::kable(livetree2)
treemap包
張杰(2019)推薦直接使用treemap包的treemap()函數(shù)繪制矩形樹(shù)形圖伞剑。
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
- 數(shù)據(jù)集livetree中斑唬,parent變量代表父類別,familytype代表子類別黎泣。
- 不曉得為什么恕刘,我嘗試各種方法,都沒(méi)辦法把這四張圖整合成一張圖輸出抒倚。
- par()和layout()設(shè)置似乎對(duì)它無(wú)效褐着。grid.arrange()不支持它。
treemapify包
- 張杰(2019)提到這個(gè)包托呕,但是可能他用的版本比較低含蓉,所以用起來(lái)很麻煩频敛。
- treemapify包是ggplot2的擴(kuò)展包,提供geom_treemap()馅扣、geom_treemap_text()函數(shù)進(jìn)行構(gòu)圖斟赚。
- 如果涉及父子嵌套,可用函數(shù)geom_treemap_subgroup_border()差油、geom_treemap_subgroup_text()等函數(shù)構(gòu)圖拗军。
library(ggplot2)
library(treemapify)
library(RColorBrewer)
#構(gòu)基本矩形框圖
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")
# 如果填充顏色的變量是連續(xù)型變量,用scale_fill_distiller()
# ggplot(livetree2, aes(area=y2010, fill=parent))+geom_treemap()+ scale_fill_distiller(palette="Greens")
tree7.png
# 添加標(biāo)簽
# 注意蓄喇,這里我用父類填充顏色发侵,用子類作為標(biāo)簽。
ggplot(livetree2, aes(area=y2010, fill=parent, label=familytype))+geom_treemap()+ scale_fill_brewer(palette="Greens") + geom_treemap_text()
#注意公罕,這里是按大小來(lái)放置器紧,同屬一個(gè)父類的子類并不在一起。
tree8.png
# 分群
# 注意楼眷,在treemapify的設(shè)計(jì)中铲汪,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
# 添加父類標(biāo)簽
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")
# 由于有些父類沒(méi)有子類罐柳,所以會(huì)出現(xiàn)標(biāo)簽重復(fù)掌腰,比較亂。不建議使用张吉。保留圖例更合適齿梁。
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()函數(shù)仍不支持合并上面用treemapify拓展包做出來(lái)的圖。
- 還好肮蛹,可以用ggplot2分面來(lái)做勺择。
# 分面
# 重置數(shù)據(jù)由寬表變長(zhǎng)表
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", "")
# 根據(jù)年份添加分面
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 = "中國(guó)老人家庭類型變遷") +
theme(legend.position = "bottom", plot.title = element_text(hjust=0.5))
tree16.png
- 注意:這里的圖例有點(diǎn)亂,主要是因?yàn)闆](méi)有將parent變量設(shè)置為因子類型伦忠。
配色
- 配色方案大致可以分為三類:?jiǎn)紊凳『恕⒍嗌岛碗p色漸變系。
- 配色主題方案可參考:
- ColorBrewer2.0
- RColorBrewer包的顏色主題方案
- 張杰(2019)書(shū)的第67頁(yè)昆码。
GIF動(dòng)畫(huà)流
EasyCharts的博文終于等到你:ggplot2樹(shù)狀圖 介紹了通過(guò)tweenr包和gganimate包來(lái)做動(dòng)圖的方案气忠。[2] 但是我沒(méi)有做成功。提示命令過(guò)時(shí)赋咽。