R: заговор нескольких аргументов в меню обновления с той же самой этикеткой - PullRequest
2 голосов
/ 28 апреля 2019

Я немного новичок в графике и пытаюсь создать точечный график до и после, в котором вы можете переключать переменные с помощью выпадающего меню.Я действительно достиг этого, но я хочу иметь функцию легенды цвета, которая классифицирует направление различий до и после на «До> После», «До <После» и т. Д. В примере я назвал эту переменную <code>dir_y.Меню обновления обновляет переменные (в моем примере y и z), но я не знаю, как обновить dir_y и dir_z, сохраняя при этом только 2 варианта выпадающего меню ("Var y" и "Var z").Излишне говорить, что мне нужно обновить dir_y и dir_z в oder, чтобы выбрать только одну категорию («До> После», «До <После» и т. Д.) Из легенды, и эта категория должна соответствовать либо <code>yили z в зависимости от того, какой из них выбран из раскрывающегося списка.Я добавил 2 комментария, где я думал, что обновление dir_y и dir_z должно пройти, но все, что я пробовал, не сработало.

Спасибо.Любая помощь очень ценится.

Вот мой код:

library(plotly)
library(tidyverse)

set.seed(81)
df <- data.frame(id = rep(1:100, 2),
                 x = c(rep("pre", 100), rep("post", 100)), 
                 y = runif(200), 
                 z = rnorm(200, mean = 50, sd = 10))
df <- df[-sample(1:nrow(df), size = 20) , ]                               # delete some rows at random to simulate missing values


df_plotly <- 
  df %>%
  mutate(x = forcats::fct_relevel(x, "pre", "post")) %>%                  # relevel Pre Post for plot
  mutate(jit_x = jitter(as.numeric(x))) %>%                               # add jitter to x discrete var before piping to plotly
  mutate(y = round(y, 2),
         z = round(z, 2)) %>%                                             # round y & z
  group_by(id) %>%                                                        # group by id
  mutate(dif_y = coalesce(lag(y) - y, y - lead(y)),                       # do Pre - Post by id for y
         dif_z = coalesce(lag(z) - z, z - lead(z))) %>%                   # do Pre - Post by id for z
  mutate(dir_y = case_when(dif_y != 0 && dif_y > 0 ~ "Pre > Post",
                           dif_y != 0 && dif_y < 0 ~ "Pre < Post",
                           dif_y == 0              ~ "Pre = Post",
                           TRUE                    ~ "Unpaired"),
         dir_z = case_when(dif_z != 0 && dif_z > 0 ~ "Pre > Post",
                           dif_z != 0 && dif_z < 0 ~ "Pre < Post",
                           dif_z == 0              ~ "Pre = Post",
                           TRUE                    ~ "Unpaired"))



p1 <-
  df_plotly %>%
  plot_ly(x = ~jit_x, y = ~y) %>%  
  add_trace(x = ~jit_x, y = ~y, color = ~dir_y, colors = c("red", "lightgrey", "green", "black"), 
            mode = 'markers+lines', type = 'scatter', hoverinfo = 'text+y',   
            text = ~paste("ID: ", id, "<br>") 
            ) %>% 
  layout(
    title = "",
    xaxis = list(title = "",
                 tickvals = list(1, 2),                       # jitter(1:2) from 2 levels factor produces values around 1 & 2, should be fine
                 ticktext = list("Pre", "Post") ),
    yaxis = list(title = "",
                 hoverformat = '.2f',            
                 zeroline = F),
    updatemenus = list(
      list(
        buttons = list(
          list(method = "restyle",
               args = list("y", list(df_plotly$y)  # , "dir_y", list(df_plotly$dir_y)
                           ),  
               label = "Var Y"),
          list(method = "restyle",
               args = list("y", list(df_plotly$z)  # ,  "dir_y", list(df_plotly$dir_z)
                           ),  
               label = "Var Z")))
    ))
p1

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...