Các lệnh vẽ đồ thị 3D trong R

Biên soạn

Duc Nguyen | www.tuhocr.com

Cập nhật

2025 May 05

Register Web

Lưu ý: Quarto không render liên tiếp các code chunk được (khi vẽ plot theo kiểu add lần lượt point vào thì ta cần gộp toàn bộ trong 1 code chunk), vì vậy để thuận tiện xuất hình thì ta chạy trực tiếp trong RStudio qua từng code chunk. File HTML bạn đang xem được mình chèn lại từng plot tương ứng ở mỗi step, code chunk đã được set eval = FALSE để giữ nguyên đoạn code (không chạy code) giúp bạn dễ hình dung workflow vẽ hình 3D.

1 Package plot3D

1.1 Vẽ theo kiểu mặc định

library(plot3D)

trees -> df

round(df, 0) -> df

names(df) <- c("DIAMETER", "HEIGHT", "VOLUME")

plot3D:::scatter3D(x = df$DIAMETER,
          y = df$HEIGHT,
          z = df$VOLUME,
          theta = 45)

1.2 Vẽ chi tiết

plot3D:::scatter3D(x = df$DIAMETER,
          y = df$VOLUME,
          z = rep(0, nrow(df)),
          theta = 65,
          phi = 20,
          colkey = FALSE,
          xlim = c(0, 30),
          ylim = c(0, 100),
          zlim = c(0, 0.5))

fit_xy <- lm(VOLUME ~ DIAMETER, data = df)

coef(fit_xy)

###

plot3D:::points3D(x = min(df$DIAMETER),
                  y = coef(fit_xy)[1] + coef(fit_xy)[2]*min(df$DIAMETER),
                  z = 0,
                  col = "red",
                  cex = 1,
                  add = TRUE,
                  pch = 19)



plot3D:::points3D(x = max(df$DIAMETER),
                  y = coef(fit_xy)[1] + coef(fit_xy)[2]*max(df$DIAMETER),
                  z = 0,
                  col = "red",
                  cex = 1,
                  add = TRUE,
                  pch = 19)

###

plot3D:::segments3D(x0 = min(df$DIAMETER),
                    y0 = coef(fit_xy)[1] + coef(fit_xy)[2]*min(df$DIAMETER),
                    x1 = max(df$DIAMETER), 
                    y1 = coef(fit_xy)[1] + coef(fit_xy)[2]*max(df$DIAMETER), 
                    z0 = 0,
                    z1 = 0,
                    lwd = 2, 
                    col = "red",
                    add = TRUE, 
                    colkey = FALSE)

###

plot3D:::segments3D(x0 = min(df$DIAMETER),
                    y0 = 0,
                    x1 = min(df$DIAMETER), 
                    y1 = 100, 
                    z0 = 0,
                    z1 = 0,
                    lwd = 1, 
                    col = "blue",
                    add = TRUE, 
                    colkey = FALSE)


plot3D:::segments3D(x0 = max(df$DIAMETER),
                    y0 = 0,
                    x1 = max(df$DIAMETER), 
                    y1 = 100, 
                    z0 = 0,
                    z1 = 0,
                    lwd = 1, 
                    col = "blue",
                    add = TRUE, 
                    colkey = FALSE)

1.2.1 Thêm các điểm dữ liệu

plot3D:::points3D(x = df$DIAMETER[df$DIAMETER == 11],
                  y = df$VOLUME[df$DIAMETER == 11],
                  z = rep(0, length(df$DIAMETER[df$DIAMETER == 11])),
                  col = "blue",
                  cex = 1,
                  add = TRUE,
                  pch = 19)
plot3D:::points3D(x = df$DIAMETER[df$DIAMETER == 14],
                  y = df$VOLUME[df$DIAMETER == 14],
                  z = rep(0, length(df$DIAMETER[df$DIAMETER == 14])),
                  col = "blue",
                  cex = 1,
                  add = TRUE,
                  pch = 19)
plot3D:::points3D(x = df$DIAMETER[df$DIAMETER == 18],
                  y = df$VOLUME[df$DIAMETER == 18],
                  z = rep(0, length(df$DIAMETER[df$DIAMETER == 18])),
                  col = "blue",
                  cex = 1,
                  add = TRUE,
                  pch = 19)

1.2.2 Thêm đường density

# d_11 <- hist(df$VOLUME[df$DIAMETER == 11], probability = TRUE)

# lines(density(df$VOLUME[df$DIAMETER == 11]))

v_11 <- df$VOLUME[df$DIAMETER == 11]

day_so <- seq(from = min(v_11, na.rm = TRUE)-10, 
              to = max(v_11, na.rm = TRUE)+10, 
              length = 1000)

# curve(expr = dnorm(day_so, 
#             mean = mean(v_11, na.rm = TRUE), 
#             sd = sd(v_11, na.rm = TRUE)), 
#       type = "l",
#       add = TRUE, 
#       lwd = 2,
#       xname = "day_so",
#       col = "blue", 
#       lty = "dotted")

density_y_11 <- dnorm(day_so, 
            mean = mean(v_11, na.rm = TRUE), 
            sd = sd(v_11, na.rm = TRUE))
plot3D:::segments3D(x0 = 11,
                    y0 = 0,
                    x1 = 11, 
                    y1 = 100, 
                    z0 = 0,
                    z1 = 0,
                    lwd = 1, 
                    col = "blue",
                    add = TRUE, 
                    colkey = FALSE)

plot3D:::segments3D(x0 = 0,
                    y0 = 16,
                    x1 = 30, 
                    y1 = 16, 
                    z0 = 0,
                    z1 = 0,
                    lwd = 1, 
                    col = "blue",
                    add = TRUE, 
                    colkey = FALSE)


plot3D:::points3D(x = rep(11, times = 1000),
                  y = day_so,
                  z = density_y_11,
                  col = "blue",
                  cex = 1,
                  add = TRUE,
                  pch = 19,
                  type = "l")

2 Tài liệu tham khảo

  1. https://cran.r-project.org/web/packages/plot3D/vignettes/plot3D.pdf

  2. https://cran.r-project.org/web/packages/scatterplot3d/scatterplot3d.pdf