介紹如何使用 dendextend
這個 R 套件,繪製各種複雜的樹狀圖。
dendextend 是一個專門用於繪製各種樹狀圖的 R 套件,其使用的樹狀圖格式為
dendrogram
,可以對樹狀圖做各種非常細微的調整,功能非常豐富。
安裝 dendextend 套件
若要安裝 dendextend
套件,可以直接從 R 官方的 CRAN 套件庫安裝:
# 安裝 dendextend 套件 install.packages('dendextend')
亦可從 GitHub 上面下載最新的版本來安裝:
# 從 GitHub 安裝 library("devtools") devtools::install_github('talgalili/dendextend')
安裝完成後,載入 dendextend
套件即可開始使用:
# 載入 dendextend 套件 library(dendextend)
dendextend
套件中處理 dendrogram
物件的函數是以 R 語言實作的,所以若遇到較大量的資料時,處理速度會比較慢,遇到這樣的狀況可以考慮改用 dendextendRcpp 套件,它是以 Rcpp(C 語言)的方式所實作的套件,功能相同但是處理速度比較快:
# 安裝 dendextendRcpp 套件 install.packages("Rcpp") devtools::install_github('talgalili/dendextendRcpp')
載入 dendextendRcpp
套件之後,就可以運用一些 dendextendRcpp_
開頭的對應函數,加速某些特定的操作:
# 載入 dendextendRcpp 套件 library(dendextendRcpp)
建議可以同時安裝 colorspace
套件,方便產生各種色盤:
# 安裝 colorspace 套件 install.packages("colorspace")
產生樹狀圖
這裡我們手動建立一個示範用的 dendrogram
樹狀圖:
# 載入 magrittr 套件 library(magrittr) # 產生一個 dendrogram 樹狀圖 dend <- 1:5 %>% dist %>% hclust %>% as.dendrogram
將 dendrogram
樹狀圖用 plot
函數畫出來:
# 畫出樹狀圖 dend %>% plot
我們可以透過一些函數取得樹狀圖的屬性:
# 樹狀圖節點的文字標示 dend %>% labels # 樹狀圖的 leaves 節點數 dend %>% nleaves # 樹狀圖的總節點數(包含 leaves) dend %>% nnodes
節點屬性
當我們想要取得樹狀圖中各個節的屬性時,通常都會使用深度優先搜尋(depth-first search)的方式來走訪每個節點。
以 get_nodes_attr
取得各個節點的屬性時,就會按照這個順序輸出:
# 取得各節點的高度 dend %>% get_nodes_attr("height")
[1] 4 1 0 0 2 0 1 0 0
# 取得各節點的子節點(leaves)數量 dend %>% get_nodes_attr("members")
[1] 5 2 1 1 3 1 2 1 1
# 判斷是否為 leaves 節點 dend %>% get_nodes_attr("leaf")
[1] NA NA TRUE TRUE NA TRUE NA TRUE TRUE
# 取得各節點的名稱 dend %>% get_nodes_attr("label")
[1] NA NA 1 2 NA 5 NA 3 4
編輯樹狀圖
若要編輯樹狀圖的各種屬性,最常用的方式就是透過 set
函數來設定,它的語法為:
set(樹狀圖物件, 屬性, 值)
其中 屬性
參數可以接受非常多種選項,舉凡文字、節點、枝幹等屬性都可用這樣的方式來設定。
節點文字
若要修改節點的文字標示內容,可以執行:
# 更改節點的文字標示 dend %>% set("labels", c(31:35)) %>% plot
通常在設定節點的文字標示時,會將變數類型轉為字元,避免未來在處理時出現其他的問題:
# 將節點文字標示類型轉為字元 dend %>% set("labels_to_char") %>% labels
[1] "1" "2" "5" "3" "4"
若要改變文字的顏色,可以執行:
# 將文字顏色改為紅色 dend %>% set("labels_col", "red") %>% plot
若要改變文字的大小,可以執行:
# 將文字大小改為 2 dend %>% set("labels_cex", 2) %>% plot
也可以個別定每個文字的內容、顏色與大小:
# 個別指定每個文字的屬性 dend %>% set("labels", c(31:35)) %>% set("labels_cex", c(1, 1, 2, 2, 3)) %>% set("labels_col", c(3, 3, 4, 4, 2)) %>% plot
在標示樹狀圖文字的顏色時,還可以配合 k
參數來指定要將整棵樹切成幾群,透過這種方式指定每一群的文字顏色:
# 分群上色 dend %>% set("labels_col", c(3, 4), k = 2) %>% plot