【问题标题】:R plotting a line at the intersection of two linesR在两条线的交点处绘制一条线
【发布时间】:2020-12-03 14:51:21
【问题描述】:

我有这个绘制两条相交线的简单代码:

x <- c(1,2,3,4,5,6)
y2 <- c(6,5,4,3,2,1)
y1 <- c(1,2,3,4,5,6)
plot(x, y1)
plot(x, y1, type="o", col="blue", pch="o", lty=1)
points(x, y2, col="red", pch="*")
lines(x, y2, col="red", lty=1)

然后我使用 locator() 函数手动找到两条线的交点位置,使用交点的坐标在与 text() 函数的交点处绘制一个标签,并在与 abline() 函数的交点位置。

p <- locator()
text(p$x, p$y+0.4, labels="S")
abline(v=p$x, lty=3)

但是,在这里我遇到了一个问题,因为我希望交叉点位置处的垂直线会在交叉点处停止(而不是沿着整个 y 轴)。

有人可以给我一个提示吗?

【问题讨论】:

    标签: r line-intersection


    【解决方案1】:

    你可以使用segments在两个x、y点之间画一条线段,所以你可以这样做:

    p <- locator()
    text(p$x, p$y + 0.4, labels = "S")
    segments(p$x, 0, p$x, p$y, lty = 3)
    

    另请注意,如果您的线总是像这样笔直,您可以通过算法找到交叉点,这比使用 locator() 更准确和可重复:

    dx  <- tail(x, 1) - head(x, 1)
    dy1 <- tail(y1, 1) - head(y1, 1)
    dy2 <- tail(y2, 1) - head(y2, 1)
    grad1 <- dy1/dx
    grad2 <- dy2/dx
    c1 <- y1[1] - grad1 * x[1]
    c2 <- y2[1] - grad2 * x[1]
    xi <- (c2 - c1)/(grad1 - grad2)
    yi <- grad1 * xi + c1
    segments(xi, 0, xi, yi, lty = 3)
    text(xi, yi + 0.4, labels = "S")
    

    【讨论】:

    • 非常感谢!我不知道segments() 函数,这确实很有帮助。也感谢有关以编程方式查找线交点的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2018-12-19
    • 1970-01-01
    • 2016-06-07
    • 2016-03-24
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多