パッケージdendextendを使用してデンドログラムを作成しようとしています。それは本当に素晴らしい gg デンドログラムを作成しますが、残念ながらそれを「円」にすると、ラベルが追いつきません。以下に例を示します。
私の距離オブジェクトはここにあります: http://speedy.sh/JRVBS/mydist.RDS
library(dendextend)
library(ggplot2)
#library(devtools) ; install_github('kassambara/factoextra')
library(factoextra)
clus <- hcut(mydist, k = 6, hc_func = 'hclust',
hc_method = 'ward.D2', graph = FALSE, isdiss = TRUE)
dend <- as.dendrogram(clus)
labels(dend) <- paste0(paste0(rep(' ', 3), collapse = ''), labels(dend))
dend <- sort(dend, decreasing = FALSE)
ggd1 <- ggplot(dend %>%
set('branches_k_color', k = 6) %>%
set('branches_lwd', 0.6) %>%
set('labels_colors', k = 6) %>%
set('labels_cex', 0.6),
theme = theme_minimal(),
horiz = TRUE)
ggd1 <- ggd1 + theme(panel.grid.major = element_blank(),
axis.text = element_blank(),
axis.title = element_blank())
ggd1 <- ggd1 + ylim(max(get_branches_heights(dend)), -3)
これにより、基本的に次のイメージが得られます
。これは素晴らしいことです。ただし、これを円に変えたいので、次を使用します。
ggd1 + coord_polar(theta = 'x')
そして、このグラフを以下に示します。これはまさに私が望むものに近いですが、ラベルを回転させるだけです。
どんな助けでも大歓迎です。内部では、dendextend が基本的にいくつかの data.framesを作成し、それらに対してgeom_segment()
andを呼び出しgeom_text()
て樹状図とラベルを作成していることを知っています。関連する data.frame を次のように公開できると思います。
back.df1 <- dendextend::as.ggdend(dend)
back.df2 <- dendextend::prepare.ggdend(back.df1)
別の戦術はggplot(labels = FALSE...)
、プロット時に使用しgeom_text()
てから、色を保持しながらgeom_text(angle = )
.
また、さまざまな ggplot ウィザードを組み合わせることでback.df2
、1 番目と 2 番目のプロットを再度取得して作成できるようになるだけでなく、ラベルの角度も制御できると思います。しかし、私はこれを行う方法がわかりません.dendextendパッケージを使用してすでに多くのことを構築しており、理想的には樹状図オブジェクトを作成するために新しいパッケージを使用する必要がないようにしたいと考えています.ラベルの外ではこれが本当に好きです!
解決
これは、以下の Richard Telford のソリューションに基づいています。最初に の編集版を作成しましたggplot.ggdend()
。これは、以下の回答で提供されているものと同じです。次に、読みやすさを向上させるために、ラベルの回転が 6 時から 12 時に切り替わるように、角度と hjust のベクトルを自動的に作成する関数を作成しました。
createAngleHJustCols <- function(labeldf) {
nn <- length(labeldf$y)
halfn <- floor(nn/2)
firsthalf <- rev(90 + seq(0,360, length.out = nn))
secondhalf <- rev(-90 + seq(0,360, length.out = nn))
angle <- numeric(nn)
angle[1:halfn] <- firsthalf[1:halfn]
angle[(halfn+1):nn] <- secondhalf[(halfn+1):nn]
hjust <- numeric(nn)
hjust[1:halfn] <- 0
hjust[(halfn+1):nn] <- 1
return(list(angle = angle, hjust = hjust))
}
次に、次のコードを使用してプロットを作成しました。
gdend <- dendextend::as.ggdend(dend %>%
set('branches_k_color', k = 6) %>%
set('branches_lwd', 0.6) %>%
set('labels_colors', k = 6) %>%
set('labels_cex', 0.6))
gdend$labels$angle <- ifelse(horiz, 0, 90)
gdend$labels$hjust <- 0
gdend$labels$vjust <- 0.5
# if polar, change the angle and hjust so that the labels rotate
if(polarplot) {
newvalues <- createAngleHJustCols(gdend$labels)
gdend$labels$angle <- newvalues[['angle']]
gdend$labels$hjust <- newvalues[['hjust']]
}
ggresult <- newggplot.ggdend(gdend, horiz = TRUE, offset_labels = -2)
ggresult <- ggresult + ggtitle(plottitle)
ggresult <- ggresult + theme(plot.margin = margin(c(2,2,2,2),
axis.text = element_blank(),
plot.title = element_text(margin = margin(10,2,2,2)))
ggresult <- ggresult + ylim(max(get_branches_heights(dend)), -5)
ggresult <- ggresult + coord_polar(theta = 'x', direction = 1)
(データのいくつかを変更したため、一部の順序がプロットで異なって見える場合があります)