sách gpt4 ai đã đi

旋转 ggplot 树状图的标签

In lại 作者:行者123 更新时间:2023-12-04 10:39:22 29 4
mua khóa gpt4 Nike

我正在尝试使用包 dendexend 创建一个树状图。它创建了非常好的 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)

这基本上给了我这个形象:
nhập mô tả hình ảnh ở đây
这很棒。但是,我想把它变成一个圆圈,所以使用:
ggd1 + coord_polar(theta = 'x') 

我在下面得到了这张图。这与我想要的非常接近,但我只需要旋转标签。
nhập mô tả hình ảnh ở đây

任何帮助表示赞赏。我知道在引擎盖下 dendextend 基本上是创建一些 data.frames 然后调用 geom_segment()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并再次创建第一个和第二个图,但也要控制标签的角度。但是,我不知道如何做到这一点,并且已经使用 dendextend 包构建了很多东西,并且理想情况下希望避免使用任何新包来创建树状图对象,因为我真的很喜欢标签之外的这个!

Giải pháp

我基于下面 Richard Telford 的解决方案。我首先创建了 ggplot.ggdend() 的编辑版本.这与以下答案中提供的相同。我接下来创建了一个函数来自动创建角度和 hjust 向量,以便标签旋转从 6 点钟切换到 12 点钟以提高可读性。
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)

这最终产生了这个最终的情节!
nhập mô tả hình ảnh ở đây

(我更改了数据中的一些内容,因此图中的某些顺序可能会有所不同)

1 Câu trả lời

这是可能的,但您需要编辑 dendextend:::ggplot.ggdend首先让它接受angle美学(还有 hjustvjust )

第一步:编辑dendextend:::ggplot.ggdend

newggplot.ggdend <- function (data, segments = TRUE, labels = TRUE, nodes = TRUE, 
horiz = FALSE, theme = theme_dendro(), offset_labels = 0, ...) {
data <- prepare.ggdend(data)
#angle <- ifelse(horiz, 0, 90)
#hjust <- ifelse(horiz, 0, 1)
p <- ggplot()
if (segments) {
p <- p + geom_segment(data = data$segments, aes_string(x = "x", y = "y", xend = "xend", yend = "yend", colour = "col", linetype = "lty", size = "lwd"), lineend = "square") +
guides(linetype = FALSE, col = FALSE) + scale_colour_identity() +
scale_size_identity() + scale_linetype_identity()
}
if (nodes) {
p <- p + geom_point(data = data$nodes, aes_string(x = "x", y = "y", colour = "col", shape = "pch", size = "cex")) +
guides(shape = FALSE, col = FALSE, size = FALSE) +
scale_shape_identity()
}
if (labels) {
data$labels$cex <- 5 * data$labels$cex
data$labels$y <- data$labels$y + offset_labels
p <- p + geom_text(data = data$labels, aes_string(x = "x", y = "y", label = "label", colour = "col", size = "cex", angle = "angle", hjust = "hjust", vjust = "vjust"))#edited
}
if (horiz) {
p <- p + coord_flip() + scale_y_reverse(expand = c(0.2, 0))
}
if (!is.null(theme)) {
p <- p + theme
}
P
}

assignInNamespace(x = "ggplot.ggdend", ns = "dendextend", value = newggplot.ggdend)

第 2 步:制作数据对象
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),
theme = theme_minimal(),
horiz = TRUE)
gdend$labels$angle <- seq(90, -270, length = nrow(gdend$labels))
gdend$labels$vjust <- cos(gdend$labels$angle * pi) / (180)
gdend$labels$hjust <- sin(gdend$labels$angle * pi) / (180)

第 3 步:绘图
ggd1 <- ggplot(gdend)
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
ggd1 + coord_polar(theta = 'x')

关于旋转 ggplot 树状图的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034663/

29 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com