gpt4 book ai didi

r - 如何将 geom_text 标签移动到 ggplot2 中的 geom_segment 箭头之后?

转载 作者:行者123 更新时间:2023-12-04 08:33:02 26 4
gpt4 key购买 nike

我有一个使用 ggplot2 绘制的 NMDS 排序。我已经使用 envfit() 在顶部添加了环境向量(来自 vegan 中的 geom_segment() 函数)并使用 geom_text() 将相应的标签添加到与线段相同的坐标上(代码如下):

ggplot() +
geom_point(data = nmds.sites.plot, aes(x = NMDS1, y = NMDS2, col = greening), size = 2) +
labs(title = "Study Area",
col = "Sites") +
geom_polygon(data = hull.data, aes(x = NMDS1, y = NMDS2, fill = grp, group = grp), alpha = 0.2) +
scale_fill_discrete(name = "Ellipses",
labels = c("High", "Moderate", "Control")) +
xlim(c(-1, 1)) +
guides(shape = guide_legend(order = 1),
colour = guide_legend(order = 2)) +
geom_segment(data = env.arrows,
aes(x = 0, xend = NMDS1, y = 0, yend = NMDS2),
arrow = arrow(length = unit(0.25, "cm")),
colour = "black", inherit.aes = FALSE) +
geom_text(data = env.arrows, aes(x = NMDS1, y = NMDS2, label = rownames(env.arrows))) +
coord_fixed() +
theme_bw() +
theme(text = element_text(size = 14))
NMDS Ordination Output
但是,由于标签对齐居中,标签的一部分有时会与箭头的末端重叠。我想在箭头的末尾有文本 START。在其他一些情况下,如果箭头朝上,它会插入文本的中间。本质上,我希望能够同时看到箭头和文本。
我试过使用 geom_text_repel()来自 ggrepel包装但放置似乎是随机的(并且还会排斥情节中的其他点或文本(或者根本不做任何事情)。
[编辑]
下面是 NMDS 向量的坐标(这是上面示例代码中的 env.arrows 对象):
                NMDS1       NMDS2
Variable1 -0.46609087 0.27567532
Variable2 -0.21524887 -0.10128795
Variable3 0.59093184 0.03423775
Variable4 -0.00136418 0.46550043
Variable5 -0.30900813 -0.19659929
Variable6 0.53510347 -0.36387227
Variable7 0.66376246 -0.05220685

最佳答案

在下面的代码中,我们创建了一个径向移位函数来将标签移离箭头。偏移量包括一个常量加上一个附加偏移量,该偏移量随标签相对于 x 轴的角度的余弦的绝对值而变化。这是因为带有 theta 的标签接近 0 或 180 度与箭头的重叠长度更大,因此需要比带有 theta 的标签移动得更远。接近 90 或 270 度。
您可能需要稍微调整代码以将标签准确放置在您想要的位置。此外,如果变量名称可以具有不同的宽度,您可能需要添加额外的调整。
附加说明:我已将变量名称转换为数据列。您也应该对您的数据执行此操作,然后将该数据列映射到 label aes 的论据.使用 rownames(env.arrows)因为标签超出了 ggplot外部数据框的函数环境env.arrows并破坏您在 data 中提供的数据框的映射论据 geom_text (尽管在这种特殊情况下它可能不会引起问题)。

library(tidyverse)
library(patchwork)

# data
env.arrows = read.table(text=" var NMDS1 NMDS2
Variable1 -0.46609087 0.27567532
Variable2 -0.21524887 -0.10128795
Variable3 0.59093184 0.03423775
Variable4 -0.00136418 0.46550043
Variable5 -0.30900813 -0.19659929
Variable6 0.53510347 -0.36387227
Variable7 0.66376246 -0.05220685", header=TRUE)

# Radial shift function
rshift = function(r, theta, a=0.03, b=0.07) {
r + a + b*abs(cos(theta))
}

# Calculate shift
env.arrows = env.arrows %>%
mutate(r = sqrt(NMDS1^2 + NMDS2^2),
theta = atan2(NMDS2,NMDS1),
rnew = rshift(r, theta),
xnew = rnew*cos(theta),
ynew = rnew*sin(theta))

p = ggplot() +
geom_segment(data = env.arrows,
aes(x = 0, xend = NMDS1, y = 0, yend = NMDS2),
arrow = arrow(length = unit(0.25, "cm")),
colour = "black", inherit.aes = FALSE) +
geom_text(data = env.arrows, aes(x = NMDS1, y = NMDS2, label = var)) +
coord_fixed() +
theme_bw() +
theme(text = element_text(size = 14))

pnew = ggplot() +
geom_segment(data = env.arrows,
aes(x = 0, xend = NMDS1, y = 0, yend = NMDS2),
arrow = arrow(length = unit(0.2, "cm")),
colour = "grey60", inherit.aes = FALSE) +
geom_text(data = env.arrows, aes(x = xnew, y = ynew, label = var), size=3.5) +
coord_fixed() +
theme_bw() +
theme(text = element_text(size = 14)) +
scale_x_continuous(expand=expansion(c(0.12,0.12))) +
scale_y_continuous(expand=expansion(c(0.07,0.07)))

p / pnew
enter image description here

关于r - 如何将 geom_text 标签移动到 ggplot2 中的 geom_segment 箭头之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64935396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com