使用 ggplot2,有没有办法在使用多线绘图设计时只标记一条线的绘图点?

With ggplot2, is there a way to only label plot points of one line when using a multi-line plot design?

提问人:MattS5000 提问时间:8/15/2023 最后编辑:stefanMattS5000 更新时间:8/15/2023 访问量:104

问:

我使用 ggplot 在图形上绘制了 2 条线,特别是使用“选择”和“收集”工具使用此方法将两个线变量折叠成键值对(此处为解决方案 2): https://www.datanovia.com/en/blog/how-to-create-a-ggplot-with-multiple-lines/

一切正常,除了我无法弄清楚如何使用“Desc”变量标记一条线的点。下面的代码使用 Desc 变量标记这两条线,但我只想标记“elevation”线。有什么想法吗?

#preparing data
library("tidyverse")
df <- mydatacsv %>%
select(Meter, Stem_Height,Elevation,Desc) %>%
gather(key = "Legend", value = "value", -Meter,-Desc)
head(df,n=200)


# Visualization
ggplot(df, aes(x = Meter, y = value,label=Desc)) + 
geom_line(aes(color = Legend)) + 
scale_color_manual(values = c("green4","black")) +
geom_point(data=mydatacsv, aes(y = Stem_Height),color="green4")+
geom_point(data=mydatacsv, aes(y = Elevation),color="black")+
xlab("Distance (m)") +
ylab("Elevation (m)")+
geom_text_repel(max.overlaps=Inf,hjust=-0.1, angle=90)

我想要绘制两条线,其中一条线的绘图点标签。取而代之的是,它在图形上放置双标签,每条线上的每个绘图点一个标签。

r ggplot2 标签 多行

评论


答:

2赞 I_O 8/15/2023 #1

您只能通过至少三种方式标记所需的组。

使用示例数据并绘制每个级别的 vs,但仅标记具有三个档位的汽车的观测值:mtcarshpmpggear

  1. 根据 Gear 的值设置标签文本:
    mtcars |>
      ggplot() +
      geom_text(aes(hp, mpg, label = ifelse(gear == 3, mpg, NA)))
  1. 为标注层提供其自己的数据子集:
    mtcars |>
      ggplot() +
      geom_text(data = mtcars |> filter(gear == 3),
                aes(hp, mpg, label = mpg)
                )
  1. 将不需要的标签的(不透明度)设置为零:alpha
mtcars |>
  ggplot() +
  geom_text(aes(hp, mpg, label = mpg, alpha = gear == 3)) +
  scale_alpha_identity()
0赞 Rui Barradas 8/15/2023 #2

由于您正在使用包,因此请更改您不想更改的标签或空白。两者中的任何一个都会删除一行的标签,将发出警告。
我假设你有长格式的数据。尽管您在问题代码的开头对其进行了重塑,但您将其绘制得好像不是一样。
tidyverseNA""NA

suppressPackageStartupMessages({
  library(dplyr)
  library(ggplot2)
  library(ggrepel)
})

# reproducible test data
set.seed(2023)
df1 <- replicate(2, cumsum(rnorm(20))) |> as.data.frame()
df1$Legend <- rep(c("A", "B"), each = 10L)
df1$Desc <- with(df1, ave(V1, Legend, FUN = \(x) paste("text", seq_along(x))))
names(df1)[1:2] <- c("Meter", "value")
head(df1)
#>         Meter      value Legend   Desc
#> 1 -0.08378436 -0.4116530      A text 1
#> 2 -1.06672810 -0.7059802      A text 2
#> 3 -2.94179542  0.5125938      A text 3
#> 4 -3.12794008  0.7567052      A text 4
#> 5 -3.76142578  0.3115533      A text 5
#> 6 -2.67062832 -1.5362504      A text 6

df1 %>%
  # mutate(Desc = ifelse(Legend == "A", Desc, NA_character_)) %>%
  mutate(Desc = ifelse(Legend == "A", Desc, "")) %>%
  ggplot(aes(Meter, value, color = Legend, label = Desc)) +
  geom_line() +
  geom_point() +
  geom_text_repel(max.overlaps=Inf,hjust=-0.1, angle=90) +
  scale_color_manual(values = c("green4", "black")) +
  xlab("Distance (m)") +
  ylab("Elevation (m)") +
  theme_bw()

创建于 2023-08-14 使用 reprex v2.0.2