Возможно ли с ggvis интерактивно изменять переменные для осей x и y?

Кто-нибудь знает, можно ли изменить переменные для оси x и y в интерактивном режиме с ggvis? Я могу изменить размер точек данных, их положение и непрозрачность, но я не могу разобраться, если можно позволить пользователю выбрать переменную из раскрывающегося списка, которая станет данными для оси x/y.

Ответы

Ответ 1

Пакет ggvis был разработан для использования в сочетании с dplyr, например. для обобщения данных. Пакет dplyr также реэкспортирует оператор трубы magrittr (%>%, см. README.md), что делает работу с ggvis 'реализация Грамматика графики особенно интуитивно понятна (см. также в этой статье автором этих пакетов, Хэдли Уикхэмом).

Ниже я проиллюстрирую, как использовать функцию input_select() для изменения x модели и оставить константу y.

Сначала нам нужно загрузить две необходимые библиотеки:

library(dplyr)
library(ggvis)

Теперь мы можем построить data.frame (я использую встроенный предварительно загруженный iris):

iris %>% 
  ggvis(x = input_select(c('Petal.Width', 'Sepal.Length'), map = as.name)) %>% 
  layer_points(y = ~Petal.Length, fill = ~Species)

Вывод:

input_select = Petal.Width

с помощью input_select это можно изменить на:

input_select = Sepal.Length

Если вы предпочитаете не использовать dplyr/magrittr, это будет выглядеть так:

p <- ggvis(iris, x = input_select(c('Petal.Width', 'Sepal.Length'), map = as.name))
layer_points(p, y = ~Petal.Length, fill=~Species)

Ответ 2

Вы можете сделать это вот так:

library('ggvis');
mtcars %>% ggvis(~mpg, input_select(names(mtcars), map = as.name)) %>% layer_lines()
# or specify by hand
mtcars %>% ggvis(~mpg, input_select(c('wt', 'disp'), map = as.name)) %>% layer_lines()

(ключ заключается в использовании карты и подходящей функции, в этом случае as.name() делает это, но вы можете создавать свои собственные, если у вас есть особые потребности)

См. документацию для input_select: http://www.rdocumentation.org/packages/ggvis/functions/input_select

Документация для интерактивности, на которую ссылается ответ, описывающий блестящее решение (ну, мне нужны точки репутации, чтобы разместить более двух ссылок, чтобы я не мог этого сделать, но ссылка указана там!) указывает, что это возможно ( вопреки тому, что говорится в этом ответе), но синтаксис при условии, что не работает:

prop(x = input_select(c("disp", "wt")), constant = FALSE)
# which is to be used with props:
props(prop(x = input_select(c("disp", "wt")), constant = FALSE))

Однако есть подсказки для использования as.name(http://ggvis.rstudio.com/properties-scales.html):

var <- "mpg"
prop("x", as.name(var))

Ответ 3

Вы не можете сделать это непосредственно в ggvis в настоящее время (v0.3). Из документа :

Currently, interactive inputs can only be used in two places:

1. as arguments to transforms: layer_smooths(span = input_slider(0, 1))
2. as properties: props(size = input_slider(10, 1000))

This means that interactive inputs can only modify the data, not the underlying plot specification. 
In other words, with only basic interactivity there’s no way to add or remove layers, or switch between different datasets. 
This is a reasonable limitation because if you’re doing exploration you can always create a new ggvis with R code, or if you’re polishing a plot for presentation, you can embed it in a Shiny app and gain full control over the plot.

Таким образом, решение заключается в использовании shiny и наличии входов для переменных и реактивном определении набора данных. Здесь ваш сервер .R:

library(shiny);library(ggvis)
shinyServer(function(input, output) {
  plotData <- reactive({
    df <- iris[,c("Sepal.Width",input$yVariable,"Species")]
    names(df) <- c("x","y","fill")
    df
  })
  reactive({ plotData() %>%  ggvis(x=~x,y=~y,fill=~fill) %>%
               layer_points() %>%
               add_axis("x", title = "Sepal.Width") %>%
               add_axis("y", title = input$yVariable) %>%
               add_legend("fill", title = "Species")
  }) %>%  bind_shiny("ggvisPlot")
})

и ваш ui.R:

library(shiny);library(ggvis)
shinyUI(fluidPage(
  titlePanel("ggvis with changing data-set"),
  sidebarLayout(
    sidebarPanel(
      selectInput("yVariable", "Y Variable:",
                  c("Petal.Width" = "Petal.Width",
                    "Petal.Length" = "Petal.Length"),selected = "Petal.Width")
    ),
    mainPanel(
      ggvisOutput("ggvisPlot")
    )
  )
))

Ответ 4

Вы также можете построить график в блестящую реактивную функцию, которая меняет местами оси. Может быть вспышка, когда ggvis перерисовывает сюжет, но он будет иметь эффект, который вы ищете.

Это изменяет код из ideamotor, выше; Я также изменил его, чтобы использовать реактивную функцию, а не реактивные данные в качестве входа в ggvis, что позволяет ggvis... о, просто попробуйте, вы увидите:

library(shiny);library(ggvis)
shinyServer(function(input, output) {
  plotData <- reactive({
    df <- iris[,c("Sepal.Width",input$yVariable,"Species")]
    names(df) <- c("x","y","fill")
    df
  })
  reactive({ 
        plt <- **plotData** %>%  ggvis(fill=~fill) %>%
               add_legend("fill", title = "Species")
        if (**input$someCheckBox**) {
               plt <- plt %>%
               layer_points(x = ~x, y = ~y) %>%
               add_axis("x", title = "Sepal.Width") %>%
               add_axis("y", title = input$yVariable)
            } else {
               plt <- plt %>% 
               layer_points(x = ~y, y = ~x) %>%
               add_axis("y", title = "Sepal.Width") %>%
               add_axis("x", title = input$yVariable)                  
            } 
        plt
  }) %>%  bind_shiny("ggvisPlot")
})

Ответ 5

Да. Вы можете сделать следующее:

library(ggvis)

mtcars %>% 
  ggvis(x = ~mpg, y = input_select(label = "Choose what to plot:",
                                   choices = names(mtcars),
                                   selected = "cyl",
                                   map = as.name)) %>% 
  layer_points()

Если вы хотите выбрать обе переменные, просто сделайте то же самое для x.