如何使用ggplot2在绘图线的交点处画出一条水平线和一条垂直线?

5

我用点连接线绘制了一个图表,在这个图表中,我想从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)

目前的结果:

在此输入图像描述

所需结果示例:

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


1
使用 geom_segment(aes(x=X,xend=X,y=0,yend=Y),linetype=2)+ geom_segment(aes(x=0,xend=X,y=Y,yend=Y),linetype=2) - Eric
3个回答

4

@Eric已经进行了评论,但@akrun在链接中也进行了回答。通过对@akrun函数应用apply函数,您还可以绘制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]))

enter image description here


3

你也可以使用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)

enter image description here

如果您希望更灵活地进行拦截,可以使用此函数。 请注意...部分,因此您可以将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)

enter image description here


3

正如@Eric在他的评论中提到的那样,geom_segment是实现所需结果的方法。此外,您需要手动计算分段应该穿过geom_liney值,这可以使用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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接