繁体   English   中英

如何在不对正方形进行硬编码的情况下在三角形的每一侧制作正方形?

[英]How to make squares on each side of the triangle without hard-coding the squares?

我有一个包含 4 个点的data.frame ,它在使用geom_path连接时创建一个三角形:

library(ggplot2)

triangle = data.frame(x = c(0, 0.5, 1, 0),
                      y = c(0, 0.5, 0, 0))

ggplot(triangle, aes(x, y)) +
        geom_path()

在此处输入图像描述

现在,我想创建一个新的data.frame (基于triangle ),它有 4 个点(例如xminxmaxyminymax ),从三角形的边创建正方形(因此,这个data.frame将有 3行(每个正方形)和 4 列(每个点)。

这是一个例子:

在此处输入图像描述

是否可以在不对正方形的边进行硬编码的情况下做到这一点?

由于正方形将成一定角度,因此您可能需要 output 表示顶点的 x、y 坐标。 这只需要一点触发。 下面的 function 接受一个 x, y 点代表一个闭合三角形的向量,并返回每边正方形顶点的数据帧:

make_squares <- function(x, y) {
  
  x1    <- x[-4]
  x2    <- x[-1]
  xdiff <- (x2 - x1)
    
  y1    <- y[-4]
  y2    <- y[-1]
  ydiff <- (y2 - y1)
  
  lengths <- sqrt(xdiff^2 + ydiff^2)
  angles  <- atan2(ydiff, xdiff)
  
  x3 <- x2 - sin(angles) * lengths
  x4 <- x1 - sin(angles) * lengths
  
  y3 <- y2 + cos(angles) * lengths
  y4 <- y1 + cos(angles) * lengths
  
  
  df <- data.frame(x = round(c(x1, x2, x3, x4, x1), 3),
                   y = round(c(y1, y2, y3, y4, y1), 3),
                   square = rep(1:3, 5))
  `row.names<-`(df[order(df$square),], NULL)
}

output 看起来像这样:

make_squares(triangle$x, triangle$y)
#>       x    y square
#> 1   0.0  0.0      1
#> 2   0.5  0.5      1
#> 3   0.0  1.0      1
#> 4  -0.5  0.5      1
#> 5   0.0  0.0      1
#> 6   0.5  0.5      2
#> 7   1.0  0.0      2
#> 8   1.5  0.5      2
#> 9   1.0  1.0      2
#> 10  0.5  0.5      2
#> 11  1.0  0.0      3
#> 12  0.0  0.0      3
#> 13  0.0 -1.0      3
#> 14  1.0 -1.0      3
#> 15  1.0  0.0      3

您可以像这样在 plot 中使用它:

ggplot(triangle, aes(x, y)) + 
  geom_path() +
  geom_polygon(data = make_squares(triangle$x, triangle$y),
               aes(group = square), fill = "green4", color = "black") +
  coord_equal()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM