在图中绘制多个geom-vline

Fab*_*rea 0 r ggplot2

我正在尝试在图中绘制两个“ geom_vline()”。

下面的代码对于一条垂直线工作正常:

x=1:7
y=1:7
df1 = data.frame(x=x,y=y)
vertical.lines <- c(2.5)

ggplot(df1,aes(x=x, y=y)) +
  geom_line()+
  geom_vline(aes(xintercept = vertical.lines))
Run Code Online (Sandbox Code Playgroud)

但是,当我通过更改添加第二条所需的垂直线时

vertical.lines <- c(2.5,4),我得到了错误:

´Error: Aesthetics must be either length 1 or the same as the data (7): xintercept´
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

d.b*_*d.b 7

ggplot(df1, aes(x = x, y = y)) +
    geom_line() +
    sapply(vertical.lines, function(xint) geom_vline(aes(xintercept = xint)))
Run Code Online (Sandbox Code Playgroud)

  • 这个答案可以处理数据子集,因此可以处理facet_wrap。RLave 的解决方案会将 geom_vline 放置在所有方面 (4认同)

RLa*_*ave 6

只需aes()在使用时删除+ geom_vline

ggplot(df1,aes(x=x, y=y)) +
  geom_line()+
  geom_vline(xintercept = vertical.lines)
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为第二个aes()与第一个冲突,这与的语法有关ggplotaesthetics正如错误告诉您的那样,所有需求都必须具有相同的长度。

您应该将其+geom_vline视为图形的注释层,而不是+geom_points+geom_line用于将数据映射到绘图的图形。(请参见此处,它们在两个不同的部分中如何显示)。

数据:

x=1:7
y=1:7
df1 = data.frame(x=x,y=y)
vertical.lines <- c(2.5,4)
Run Code Online (Sandbox Code Playgroud)