我正在制作一个散点图,并想用相同的标签标记几个点。
data.frame(label=rep(c("a","b","c"),2), x=rep(c(1:3),2), y=(5,4,7,2,6,9))
如您所见,标签在相同的 x 值处出现两次,只有 y 不同。我希望两者都使用一个“a”来标记,而不是每个坐标[1,5]
都使用一个“a”。[1,2]
我正在使用 R、ggplot2 和 ggrepel。
我想这就是你想要的。
我正在使用 dplyr 或 tidyverse 包。
library(tidyverse)
数据集
dat1 <- data.frame(label=rep(c("a","b","c"),2), x=rep(c(1:3),2), y=c(5,4,7,2,6,9))
为标签创建数据集。这将创建一个标签数据集,它将在给定 X 的中点 Y 处选择一个标签点。
lab1 <- dat1 %>% group_by(label) %>% mutate(x = x, y = mean(y))
这将使用点的原始数据集和标签的标签数据集创建绘图。
ggplot() +
geom_point(data=dat1, aes(x=x, y=y)) +
geom_text(data=lab1, aes(x=x, y=y, label=label), size = 5) +
theme_grey()
上面实际上将标签绘制在彼此之上,但您不会注意到。如果您真的只想要一次,那么您可以执行以下操作并使用lab2 更新之前的代码。我也改变了大小,所以你可以看到。
lab2 <-unique(lab1)
ggplot() +
geom_point(data=dat1, aes(x=x, y=y)) +
geom_text(data=lab2, aes(x=x, y=y, label=label), size=10) +
theme_grey()
如果您希望 x 方向更向右或更高,您可以通过向标签数据集添加偏移量来更新标签数据集。
lab1 <- dat1 %>% group_by(label) %>% mutate(x = x+.3, y = mean(y) + .5)
或者,您可以在 geom_text 本身中使用微调来完成相同的操作。
ggplot() + geom_point(data=dat1, aes(x=x, y=y)) +
geom_text(data=lab1, aes(x=x, y=y, label=label), size=10, nudge_x = .3, nudge_y = .5) +
theme_grey()
这可以工作:
dat <- data.frame(label=rep(c("a","b","c"),2), x=rep(c(1:3),2), y=c(5,4,7,2,6,9))
ggplot() + geom_point(data=dat, aes(x=x, y=y)) + geom_text(data=dat[duplicated(dat$label),], aes(x=x, y=y, label=label))