Как сделать 3D линейные графики, сгруппированные по двум факторам, с пакетом Plotly в R? - PullRequest
1 голос
/ 18 апреля 2020

Я проверил официальную веб-страницу Plotly , но как составить план, мне все еще не удается выполнить следующую задачу:

id <- c(rep(1,5), rep(2,5), rep(3,5), rep(4,5))
t <- rep(seq(50,75,length.out=5), 4)
x <- runif(20) + sin(t) 
y <- rnorm(20) + cos(t)
gender <- c(rep("F",10), rep("M",10))
smoke <- c(rep("Y",5), rep("N",10), rep("Y",5))

DATA <- data.frame(ID, t, x, y, gender, smoke)

fig <- plot_ly(DATA, x = ~t, y = ~y, z = ~x, .......)

Предположим, у меня есть 4 группы пациентов (сгруппированные по 2 факторы, женщины / мужчины и курящие / некурящие), каждый из которых связан с 5 наблюдениями $ (x_i, y_i) $ вдоль отметок времени $ t_i $. Поэтому мне нужно нарисовать трехмерный линейный график $$ {(t_i, x_i, y_i)} _ {i = 1} ^ {i = 5} $ для каждого пациента, но все на одном холсте для черчения. Если я хочу представить полов красным / синим, курильщиков solid и некурящих - да sh строк и указать их в легенде, что мне следует делать (в идеале, используя R)?

1 Ответ

1 голос
/ 18 апреля 2020

Вид трехмерного графика, который вы имеете в виду, может быть достигнут следующим образом:

library(plotly)

id <- c(rep(1,5), rep(2,5), rep(3,5), rep(4,5))
t <- rep(seq(50,75,length.out=5), 4)
x <- runif(20) + sin(t) 
y <- rnorm(20) + cos(t)
gender <- c(rep("F",10), rep("M",10))
smoke <- c(rep("Y",5), rep("N",10), rep("Y",5))

DATA <- data.frame(id, t, x, y, gender, smoke)

col_gender <- c(M = "red", F = "blue")
lt_smoke <- c(Y = "solid", N = "dash")
sym_id <- c(`1` = "circle", `2` = "square", `3` = "diamond", `4` = "cross")

fig <- plot_ly(DATA, 
               x = ~x, y = ~y, z = ~t, symbol = ~id, color = ~gender, linetype = ~smoke, type = 'scatter3d', mode = 'lines+markers',
               line = list(width = 6),
               marker = list(size = 3.5, cmin = -20, cmax = 50),
               colors = col_gender,
               linetypes = lt_smoke,
               symbols = sym_id)
fig

Редактировать:

В случае большего количества пациентов лучшим вариантом является отображение id на раскрасьте и добавьте группу по id, используя преобразование groupby

library(plotly)

id <- c(rep(1,5), rep(2,5), rep(3,5), rep(4,5), rep(5,5), rep(6,5), rep(7,5), rep(8,5))
t <- rep(seq(50,75,length.out=5), 8)
x <- runif(40) + sin(t) 
y <- rnorm(40) + cos(t)
gender <- c(rep("F",10), rep("M",10), rep("F",10), rep("M",10))
smoke <- c(rep("Y",5), rep("N",10), rep("Y",5), rep("Y",5), rep("N",10), rep("Y",5))

lt_smoke <- c(Y = "solid", N = "dash")
sym_id <- c(M = "circle", F = "square")

fig <- plot_ly(DATA, 
               x = ~x, y = ~y, z = ~t, symbol = ~gender, color = ~id, linetype = ~smoke, type = 'scatter3d', mode = 'lines+markers',
               line = list(width = 6),
               marker = list(size = 3.5, cmin = -20, cmax = 50),
               linetypes = lt_smoke,
               symbols = sym_id,
               transforms = list(
                 list(
                   type = 'groupby',
                   groups = ~id)
               ))
fig
...