Vẽ nhiều dòng thời gian trong không gian 3D với ggplot / plotly

Nov 16 2020

Tôi có một khung dữ liệu chứa các tín hiệu chuỗi thời gian khác nhau mà tôi đang cố vẽ ở dạng 3D, với trục x biểu thị Thời gian, trục Y biểu thị giá trị chuẩn hóa cho tất cả các dòng và trục Z hiển thị từng dòng . Đây là một ví dụ về những gì tôi muốn nói.

Tôi có một đoạn mã hiện đang cố định cấu hình để xuất ra đúng cách nhưng tôi không chắc cách chỉ định đúng các biến y và z. Df chứa 5 cột; Thời gian + 4 tín hiệu chuỗi thời gian khác nhau.

plot_ly(
  data = df,
  x = df$Time,
  y = scale(df),
  z = names(df),
  type = 'scatter3d',
  mode = 'lines',
  color = c('red', 'blue', 'yellow', 'green'))

Khung dữ liệu trông giống như vậy:

      Time       coup.nu          Coup.nuti       coup.Ca       coup.B
1  198.001  0.0002630826       0.0003027965  2.141347e-07            1
2  198.002  0.0002630829       0.0003027953  2.141379e-07            1
3  198.003  0.0002630833       0.0003027940  2.141412e-07            1
4  198.004  0.0002630836       0.0003027928  2.141444e-07            1
5  198.005  0.0002630840       0.0003027916  2.141477e-07            1

Tôi đang cố gắng sử dụng plotly hoặc ggplot để thực hiện kết xuất. Cảm ơn đã giúp đỡ!

Tôi lấy nguồn này từ: https://www.r-bloggers.com/2016/06/3d-density-plot-in-r-with-plotly/

Trả lời

ismirsehregal Nov 18 2020 at 08:19

Trong trường hợp như thế này, bạn nên định dạng lại dữ liệu của mình từ rộng sang dài bằng cách sử dụng ví dụ melt:

library(plotly)
library(reshape2)

DF <- data.frame(
        Time = c(198.001, 198.002, 198.003, 198.004, 198.005),
     coup.nu = c(0.000263083,0.000263083,0.000263083, 0.000263084,0.000263084),
   Coup.nuti = c(0.000302797,0.000302795,0.000302794, 0.000302793,0.000302792),
     coup.Ca = c(2.14e-07, 2.14e-07, 2.14e-07, 2.14e-07, 2.14e-07),
      coup.B = c(1L, 1L, 1L, 1L, 1L)
)
DF_long <- melt(DF, id.vars=c("Time"))

plot_ly(
  data = DF_long,
  type = 'scatter3d',
  mode = 'lines',
  x = ~ Time,
  y = ~ value,
  z = ~ variable,
  color = ~ variable,
  colors = c('red', 'blue', 'yellow', 'green'))

Nếu bạn muốn tránh định dạng lại, data.framebạn có thể sử dụng add_traceđể thêm dấu vết mới cho từng cột dữ liệu của mình.