[英]Generalizing a 2D plot to 3D in R
我有一個問題,我想要在 xy 平面中使用 (x,y) 坐標的數據 plot。 此外,我有一些框約束,因此需要繪制和檢查 -7 < x < 7 和 -5 < y < 5。 所有落在這個盒子約束之外的點我想塗成紅色。 為此,我在 R 中有以下代碼:
library(rgl)
x <- 7
y <- 5
data.x <- rnorm(10,0,5)
data.y <- rnorm(10,0,5)
plot(data.x, data.y, xlim = c(min(-x,data.x),max(x,data.x)),
ylim = c(min(-y,data.y),max(y,data.y)), pch = 19)
rect(-x, -y, x, y, col = "lightgrey")
idx <- abs(data.x) > x | abs(data.y) > y
points(data.x[idx], data.y[idx], col = "red", pch = 19)
points(data.x[!idx], data.y[!idx], col = "deepskyblue", pch = 19)
現在,我遇到的問題是,當我有第三組數據和第三個約束時,如何 plot 這種類型的數據圖片。 IE,
### How to generalize when I have a third axis and constraint, i.e., a 3D cube
z <- 4
data.z <- rnorm(10, 0, 5)
所以基本上我想要 plot 一個框約束作為 xyz 平面中的立方體,並再次將落在框約束之外的點着色為紅色。
另外,我應該說我知道 R 中有 plottig 3d 散點圖的函數,但是,我正在努力的是如何繪制定義約束的 3D 立方體。
像這樣的 3D plot 的困難在於能夠解釋圖像中點的“深度”。 動畫 3D 圖像在這里可能會有幫助:
library(plot3D)
x <- 7
y <- 5
z <- 6
set.seed(123)
data.x <- rnorm(10, 0, 5)
data.y <- rnorm(10, 0, 5)
data.z <- rnorm(10, 0, 5)
in_out <- abs(data.x) > x | abs(data.y) > y | abs(data.z) > z
for(i in seq(0, 358, 2)) {
png(paste0("box", sprintf("%03d", i), ".png"))
box3D(-x, -y, -z, x, y, z, col = NA, border = "gray50", theta = i, phi = 15,
xlim = c(-10, 10), ylim = c(-10, 10), zlim = c(-10, 10),
axes = TRUE, ticktype = "detailed")
points3D(data.x, data.y, data.z, colvar = in_out, pch = 16, cex = 3,
add = TRUE, colkey = FALSE, col = c("lightblue", "red"))
dev.off()
}
library(magick)
list.files(pattern = 'box\\d+\\.png', full.names = TRUE) %>%
image_read() %>%
image_join() %>%
image_animate(fps=50) %>%
image_write("box.gif")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.