Интерактивность в рамках одного графика — ggvis

У меня есть следующий ggvis с блестящим кодом, который создает 2 графика с набором данных mtcars, поставляемым с R. На первом графике, если я дважды щелкну точку, все точки с одинаковым количеством передач (mtcars$gear) в пределах 2-й график становится красным. Автомобили могут иметь 3, 4 или 5 передач. Итак, если я нажму на точку на 1-м графике, имеющую 3 передачи, все автомобили с 3-мя передачами превратятся в красные точки на 2-м графике.

Это код server.R-

library(ggvis)
library(dplyr)

mtcars$id <- seq_len(nrow(mtcars))


shinyServer(function(input, output, session) {

  lb <- linked_brush(keys = mtcars$id, "red")

  mtcars %>%
    ggvis(~mpg, ~wt) %>%
    layer_points(fill := lb$fill, fill.brush := "red") %>%
    lb$input() %>%
    set_options(width = 300, height = 300) %>%
    bind_shiny("plot1") # Very important!

  # A subset of mtcars, of only the selected points
  selected <- lb$selected
  mtcars_selected <- reactive({
    mtcars[selected(), ]
  })

  mtcars_selected1 <- reactive({
    print(mtcars[mtcars$gear == mtcars[selected(), ]$gear, ])
  })

  vis <- reactive({ 
    mtcars %>%
    ggvis(~mpg, ~wt) %>%
    layer_points()  %>%
    add_data(mtcars_selected1) %>%
    layer_points(fill := "#dd3333") %>%
    set_options(width = 300, height = 300)
  })

  vis %>% bind_shiny("plot2")
})

Это код ui.R -

library(ggvis)

shinyUI(bootstrapPage(
  ggvisOutput("plot1"),
  ggvisOutput("plot2")
))

У меня вопрос, можно ли это сделать на том же графике? То есть я хочу нажать на точку, и все точки с одинаковым количеством передач станут красными на том же графике. Я долго гуглил, и я не могу найти какое-либо направление. Любая помощь будет оценена.


person nafizh    schedule 10.02.2015    source источник
comment
Не могли бы вы воспроизвести этот пример, чтобы я мог попробовать его на своей машине? Кажется, не хватает некоторого кода пользовательского интерфейса.   -  person Andrie    schedule 10.02.2015
comment
Привет, извини, я забыл об этом. Сейчас я добавил код server.R и ui.R.   -  person nafizh    schedule 10.02.2015


Ответы (1)


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

  mtcars %>%
    ggvis(~mpg, ~wt) %>%
    layer_points(fill := lb$fill, fill.brush := "red") %>%
    lb$input() %>%
    set_options(width = 300, height = 300) %>%
    #the next line will add red points that have the same gear as the ones selected
    layer_points(fill := "red", data = reactive(mtcars[mtcars$gear %in% mtcars[lb$selected(),]$gear,])) %>%
    bind_shiny("plot1") # Very important!
person NicE    schedule 10.02.2015
comment
Это здорово, большое спасибо :). Хотя я примерно понимаю, что вы сделали в новой вставленной строке, не могли бы вы сообщить мне, каков был ваш мыслительный процесс за этим? В частности, поскольку я новичок в ggvis, я в основном пытался работать, просматривая официальную документацию ggvis. Но там нет функции layer_points(), и я узнал об этом из учебника ggvis. Меня также смущает, какие аргументы может принимать функция, поскольку они кажутся очень произвольными. - person nafizh; 10.02.2015
comment
Я просто подумал, что было бы проще добавить слой красного цвета поверх точек, которые имеют те же шестерни, что и выбранные, таким образом, добавленный layer_points. Вы можете найти примеры их использования здесь. Здесь требовалось два аргумента: fill для цвета и data для данных, которые должны быть нанесены на график. Данные находятся в reactive, потому что они нуждаются в обновлении при изменении lb$selected (выбранных точек). - person NicE; 11.02.2015