【问题标题】:One label for multiple points一个标签用于多个点
【发布时间】:2019-06-29 21:08:49
【问题描述】:

我正在制作一个散点图,并想用相同的标签标记几个点。

data.frame(label=rep(c("a","b","c"),2), x=rep(c(1:3),2), y=(5,4,7,2,6,9))

如您所见,标签在相同的 x 值处出现两次,只有 y 不同。我希望 [1,5][1,2] 都使用单个“a”进行标记,而不是每个坐标都使用一个“a”。

我正在使用 R、ggplot2 和 ggrepel。

【问题讨论】:

  • 我想我有点困惑......如果你只想要一个标签,为什么不只使用数据框的前半部分?
  • 因为 y 不同。它不是同一点。两个点共享相同的标签。
  • 你能展示一张你想要的图片吗?
  • 请看更新。

标签: r ggplot2 ggrepel


【解决方案1】:

这可以工作:

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))

【讨论】:

  • 感谢您的努力,但这会删除一半的数据,只标记剩余的一点。一个标签应该指向两个点。
【解决方案2】:

我想这就是你想要的。

我正在使用 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 中使用 nudge 完成同样的操作。

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()

【讨论】:

  • 这是一个不错的解决方案,但不能使用 ggrepel 并让箭头/线指向这些点吗?这是一个简化的图,如果它有数百个数据点怎么办?
  • 如果这有数百个数据点,那么你就不想做你建议的情节。为什么要用一个标签和多条线来标记许多点?最好只使用填充颜色使相同的“标记”点具有相同的颜色,然后您的图例将为您提供标签。
  • 对不起,那条评论很无知。此外,当提出问题时,应该提出问题的解决方案,而不是完全不同的东西。
猜你喜欢
  • 2020-05-10
  • 1970-01-01
  • 2012-03-10
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多