[英]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 个点(例如xmin
、 xmax
、 ymin
、 ymax
),从三角形的边创建正方形(因此,这个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.