3

我用一条线连接了点。在这个图中,我想画一条从 x 轴上的点到与绘图线相交的垂直线。在相交处,我想画一条到 Y 轴的水平线。我已经搜索了几个网站,论坛和教程,但我仍然无法做到。有什么帮助吗?

library(ggplot2)

X <- 1:5
Y <- c(2, 6, 4, 7, 12)

DF <- data.frame(X, Y)

ggplot(data = DF,
       aes(x = X,
           y = Y)) +
  geom_point() +
  geom_line() +
  geom_vline(xintercept = 4.5,
             linetype = 2)

到目前为止的结果:

在此处输入图像描述

期望结果的示例:

在此处输入图像描述 在此处输入图像描述

4

3 回答 3

2

@Eric 已经评论过,但@akrun 在链接中也有一些回答,通过将apply函数应用于 @akrun 的函数,您还可以绘制 的所有点DF,这样的事情对您有用:

library(ggplot2)
X <- 1:5
Y <- c(2, 6, 4, 7, 12)
DF <- data.frame(X, Y)

draw_guides<- function(x, y) {
  list(geom_segment(aes(x = -Inf, xend = x, y = y, yend = y), linetype = "dashed"),
       geom_segment(aes(x = x, xend = x, y = y, yend = -Inf), linetype = "dashed"))
}

ggplot(data = DF,
       aes(x = X,
           y = Y)) +
  geom_point() +
  geom_line() +
  apply(DF, 1, function(y) draw_guides(y[1], y[2]))

在此处输入图像描述

于 2021-12-20T11:06:06.597 回答
1

正如@Eric 在他的评论中已经提到的那样,这geom_segment是实现您想要的结果的方法。此外,您必须手动计算y段应该切割的值,geom_line这可以使用approx. 快速方法可能如下所示:

library(ggplot2)

X <- 1:5
Y <- c(2, 6, 4, 7, 12)

DF <- data.frame(X, Y)

# vertical line
vsegment <- function(x, X, Y) {
  geom_segment(aes(x = x, xend = x, y = -Inf, yend = approx(X, Y, x)$y),
               linetype = 2)  
}
# horizontal line
hsegment <- function(x, X, Y) {
  geom_segment(aes(x = -Inf, xend = x, y = approx(X, Y, x)$y, yend = approx(X, Y, x)$y),
               linetype = 2)  
}
ggplot(data = DF,
       aes(x = X,
           y = Y)) +
  geom_point() +
  geom_line() +
  vsegment(4.5, X, Y) +
  hsegment(4.5, X, Y)

于 2021-12-20T10:58:42.793 回答
1

您也可以为此使用 geom_path()

X <- 1:5
Y <- c(2, 6, 4, 7, 12)

DF <- data.frame(X, Y)
          
ggplot(data = DF, aes(x = X, y = Y)) +
  geom_point() +
  geom_line() +
  geom_path(data = data.frame(x = c(-Inf, 4.5, 4.5), y = c(approx(X, Y, 4.5)$y, approx(X, Y, 4.5)$y, -Inf)), aes(x, y), color = "red", linetype = 2)

在此处输入图像描述

如果您希望它更灵活地进行更多拦截,您可以使用此功能。请注意该...部分,以便您可以传递geom_path参数,例如颜色、线型、大小等。它支持基于x值或基于值的截距y

my_intercept <- function(x, y, ...) {
  if (!missing(x)) dt <- data.frame(x = c(-Inf, x, x), y = c(approx(X, Y, x)$y, approx(X, Y, x)$y, -Inf))
  if (!missing(y)) dt <- data.frame(x = c(-Inf, approx(Y, X, y)$y, approx(Y, X, y)$y), y = c(y, y, -Inf))
  geom_path(data = dt, aes(x, y), ...)
}

ggplot(data = DF, aes(x = X, y = Y)) +
  geom_point() +
  geom_line() +
  my_intercept(x = 4.5, color = "blue", linetype = 2) +
  my_intercept(y = 5, color = "red", linetype = 4)

在此处输入图像描述

于 2021-12-20T11:06:03.967 回答