矩形樹(shù)狀圖


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è)置為因子類型伦忠。

配色

GIF動(dòng)畫(huà)流


  1. 張杰旧噪,《R語(yǔ)言數(shù)據(jù)可視化之美:專業(yè)圖表繪制指南》,電子工業(yè)出版社脓匿,2019淘钟。 ?

  2. 張杰就是EasyCharts的主創(chuàng)。書(shū)的內(nèi)容趕不上軟件包的更新陪毡,多注意公眾號(hào)的最新內(nèi)容日月。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袱瓮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爱咬,更是在濱河造成了極大的恐慌尺借,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件精拟,死亡現(xiàn)場(chǎng)離奇詭異燎斩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蜂绎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)栅表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人师枣,你說(shuō)我怎么就攤上這事怪瓶。” “怎么了践美?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵洗贰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我陨倡,道長(zhǎng)敛滋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任兴革,我火速辦了婚禮绎晃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杂曲。我一直安慰自己庶艾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布擎勘。 她就那樣靜靜地躺著咱揍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪货抄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天朱转,我揣著相機(jī)與錄音蟹地,去河邊找鬼。 笑死藤为,一個(gè)胖子當(dāng)著我的面吹牛怪与,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缅疟,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼分别,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遍愿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耘斩,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沼填,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后括授,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坞笙,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年荚虚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薛夜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡版述,死狀恐怖梯澜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渴析,我是刑警寧澤晚伙,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站檬某,受9級(jí)特大地震影響撬腾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恢恼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一民傻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧场斑,春花似錦漓踢、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至青责,卻和暖如春挺据,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脖隶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工扁耐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人产阱。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓婉称,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子王暗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354