簡體   English   中英

將R中的二維plot推廣到3D

[英]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") 

盒子.gif 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM