Блестящая всплывающая подсказка ggvis Rstudio при наведении мыши

В приведенном ниже примере у меня есть интерактивный блестящий график ggvis, но я добавил столбец long, который представляет собой длинную строку, и по какой-то причине мое всплывающее окно показывает wt и mpg, но не показывает long.

Кроме того, если список элементов в легенде слишком длинный, они будут скрыты в правом нижнем углу графика. Есть ли способ сложить их в несколько столбцов в легенде?

Есть идеи?

# ui.R
library(ggvis)
shinyUI(pageWithSidebar(
  div(),
  sidebarPanel(
    sliderInput("n", "Number of points", min = 1, max = nrow(mtcars),
                value = 10, step = 1),
    uiOutput("plot_ui")
  ),
  mainPanel(
    ggvisOutput("plot"),
    tableOutput("mtc_table")
  )
))


# server.R
library(shiny)
library(ggvis)
shinyServer(function(input, output, session) {
  # A reactive subset of mtcars
  mtc <- reactive({
      data = mtcars[1:input$n, ]
      data$long = as.character(paste0("A car with ",data$cyl," cylinders and ",data$gear," gears and ",data$carb, " carburators"))
      data
  })
  # A simple visualisation. In shiny apps, need to register observers
  # and tell shiny where to put the controls
  mtc %>%
    ggvis(~wt, ~mpg) %>%
    layer_points(fill = ~factor(long)) %>%
    add_tooltip(function(data){paste0("Wt: ", data$wt, "<br>", "Mpg: ",as.character(data$mpg), "<br>", "String: ", as.character(data$long))}, "hover") %>%
    bind_shiny("plot", "plot_ui")

   output$mtc_table <- renderTable({
     mtc()[, c("wt", "mpg", "long")]
   })
})

person 719016    schedule 25.07.2014    source источник


Ответы (2)


Вам нужно добавить long, так как в настоящее время ключ data$long имеет значение null в анонимной функции, предоставленной add_tooltip:

library(shiny)
library(ggvis)

runApp(list(ui = pageWithSidebar(
  div(),
  sidebarPanel(
    sliderInput("n", "Number of points", min = 1, max = nrow(mtcars),
                value = 10, step = 1),
    uiOutput("plot_ui")
  ),
  mainPanel(
    ggvisOutput("plot"),
    tableOutput("mtc_table")
  )
)
, server= function(input, output, session) {
  # A reactive subset of mtcars
  mtc <- reactive({
    data = mtcars[1:input$n, ]
    data$long = as.character(paste0("A car with ",data$cyl," cylinders and ",data$gear," gears and ",data$carb, " carburators"))
    data
  })
  # A simple visualisation. In shiny apps, need to register observers
  # and tell shiny where to put the controls
  mtc %>%
    ggvis(~wt, ~mpg, key:= ~long) %>%
    layer_points(fill = ~factor(long)) %>%
    add_tooltip(function(data){
      paste0("Wt: ", data$wt, "<br>", "Mpg: ",as.character(data$mpg), "<br>", "String: ", as.character(data$long))
    }, "hover") %>%
    bind_shiny("plot", "plot_ui")

  output$mtc_table <- renderTable({
    mtc()[, c("wt", "mpg", "long")]
  })
})
)

введите здесь описание изображения

person jdharrison    schedule 25.07.2014
comment
что если я хочу добавить больше столбцов во всплывающую подсказку? Как добавить их в key? - person 719016; 30.07.2014
comment
это не работает, если long не уникален. key должен быть уникальным - person yahiaelgamal; 02.12.2014
comment
@ 20050-8519-21102-26896-16937 См. примечание о добавлении идентификатора в фрейм данных, из которого вы хотите извлечь больше столбцов [данных]. rpackages.ianhowson.com/cran/ggvis/man/add_tooltip.html - person c.gutierrez; 20.01.2015

Я тоже некоторое время ломал голову над этим. Похоже, вы можете получить информацию TOOLTIP только из данных ggvis(). Итак, если у вас есть ggvis(~wt, ~mp), вы можете показать wt и mp во всплывающей подсказке. Если у вас есть ggvis(~wt, ~mpg, fill= ~long), вы можете показать wt, mp, long во всплывающей подсказке. Или данные, находящиеся в слое_.....(fill = ~long ,stroke = ~name, strokeWidth := 0). (Я создал ~name из имен строк) Вам нужно подавить обводку и легенду, чтобы избежать визуального воздействия: hide_legend("stroke") %>%

Насколько я могу найти, ggvis ограничивает количество информации, отображаемой во всплывающей подсказке, тем, что содержится (вполне понятно)

Если мы посмотрим на документацию:

***Usage***
ggvis(data = NULL, ..., env = parent.frame())

***Arguments***
data A data object.

... Property mappings. If not named, the first two mappings are taken to be x and y. 

Common properties are x, y, stroke, fill, opacity, shape

env Environment in which to evaluate properties.

поэтому мы можем добавить x, y, обводку, заливку, непрозрачность, форму, ключ (должны быть уникальные значения), текст, шрифт, размер шрифта и т. д. или что-то еще в одном из свойств layer_......

Было бы неплохо, если бы можно было добавить в ggplot данные фрейма данных, которые не используются на графике, но доступны только в TOOLTIP. Если я найду способ, я тоже опубликую это здесь

Я добавил невидимую информацию NAME, видимую только во всплывающей подсказке, таким образом (на основе предыдущего примера):

mtc <- reactive({
  if(length(input$n)>0){
    data = mtcars[1:input$n, ]
    data$long = as.character(paste0("A car with ",data$cyl," cylinders and     ",data$gear," gears and ",data$carb, " carburators"))
    data$name <- rownames(data) 

  data %>%
    ggvis(~wt, ~mpg) %>%
    layer_points(fill = ~long ,stroke = ~name, strokeWidth := 0) %>%
    hide_legend("stroke") %>%
    add_tooltip(function(dataT){
      paste0("Car: ",dataT$name, "<br>", "Wt: ", dataT$wt, "<br>",
      "Mpg: ",as.character(dataT$mpg), "<br>", "String: ", as.character(dataT$long))
    }, "hover") %>%
    bind_shiny("plot", "plot_ui")

  data
  }
})

Предложения по лучшему и более стабильному решению более чем приветствуются! ;^)


ОК, я нашел способ показать все данные во всплывающей подсказке, которых нет на графике ggvis: (см. также: Добавить данные во всплывающую подсказку ggvis, которые содержатся во входном наборе данных, но не непосредственно в vis )

Ключ уникальный!!! ссылку на другой набор данных и функцию вне ggvis(), которая возвращает данные и информацию для отображения в TOOLTIP.

Я изменил свой код на:

mtc <- reactive({
  if(length(input$n)>0){
    data = mtcars[1:input$n, ]
    data$long = as.character(paste0("A car with ",data$cyl," cylinders and ",data$gear," gears and ",data$carb, " carburators"))
    data$name <- rownames(data) 


  all_values <- function(x) {
    if(is.null(x)) return(NULL)
    row <- data[data$name == x$name, ]
    paste0(names(row), ": ", format(row), collapse = "<br />")
  }

  data %>%
    ggvis(~wt, ~mpg, key := ~name) %>%
    layer_points(fill = ~long) %>%

    add_tooltip(all_values, "hover")  %>%
#       add_tooltip(function(dataT){
#       paste0("Car: ",dataT$name, "<br>", "Wt: ", dataT$wt, "<br>", "Mpg: ",as.character(dataT$mpg), "<br>", "String: ", as.character(dataT$long))
#       }, "hover") %>%
    bind_shiny("plot", "plot_ui")

  data
  }
})

Таким образом, вы можете изменить информацию всплывающей подсказки любым удобным для вас способом!

введите здесь описание изображения


И к ТОП-вещам, если вы можете объединить два (Hover -> сводная информация && Click -> ALL info) следующим образом:

mtc <- reactive({
  if(length(input$n)>0){
    data = mtcars[1:input$n, ]
    data$long = as.character(paste0("A car with ",data$cyl," cylinders and ",data$gear," gears and ",data$carb, " carburators"))
    data$name <- rownames(data) 


  all_values <- function(x) {
    if(is.null(x)) return(NULL)
    row <- data[data$name == x$name, ]
    paste0(names(row), ": ", format(row), collapse = "<br />")
  }

  data %>%
    ggvis(~wt, ~mpg, key := ~name) %>%
    layer_points(fill = ~long) %>%

    add_tooltip(all_values, "click")  %>%
    add_tooltip(function(dataT){
      paste0("Car: ",dataT$name, "<br>", "Wt: ", dataT$wt, "<br>", "Mpg: ",as.character(dataT$mpg), "<br>", "String: ", as.character(dataT$long))
      }, "hover") %>%
    bind_shiny("plot", "plot_ui")

  data
  }
})

Лишь бы быть полным!

Чтобы быть еще более полным -> всплывающая подсказка - это просто HTML-код в виде строки -> таким образом, вы можете создать любую HTML-страницу, которую хотите отобразить. Вы просто не можете указать на него, потому что, как только вы покинете точку, она исчезнет! (но вы можете иметь действие щелчка в той же точке, чтобы дополнить (например, перенаправить страницу) действие наведения.)

просто последний короткий пример изображения во всплывающей подсказке:

  add_tooltip(function(img){'<img src="pic_mountain.jpg" alt="Mountain View" style="width:100px;height:100px;">'}, "hover") %>%

(Извините за длинный ответ)

person irJvV    schedule 05.08.2015