Rstudio闪亮的ggvis鼠标悬停提示

7
在下面的示例中,我有一个交互式的shiny ggvis图,但我添加了一个long列,它是一个很长的字符串,由于某种原因,我的悬停弹出窗口显示wtmpg,但不显示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")]
   })
})
2个回答

11
你需要将 long 添加为一个关键字,因为在提供给 add_tooltip 的匿名函数中,data$long 目前为 null。
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")]
  })
})
)

输入图像描述


1
如果我想要在工具提示中添加更多的列,该怎么办?我如何将它们添加到“key”中? - 719016
1
如果“long”不唯一,则此方法无效。 “key”必须是唯一的。 - yahiaelgamal
@20050-8519-21102-26896-16937 请注意,从您想要提取更多[数据]列的数据框中添加ID的注释。http://rpackages.ianhowson.com/cran/ggvis/man/add_tooltip.html - c.gutierrez

11

我也苦思了一段时间。看起来你只能获取在ggvis()数据内的提示框信息。所以如果你有ggvis(~wt, ~mp),你可以在提示框中显示wt和mp。如果你有ggvis(~wt, ~mpg, fill= ~long),你可以在提示框中显示wt、mp和long。

或者是在layer_.....(fill = ~long ,stroke = ~name, strokeWidth := 0)中的数据。(我从行名创建了~name)你需要抑制stroke和legend以避免视觉影响: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、stroke、fill、opacity、shape、key(必须是唯一值)、text、font、fontsize等任何一个layer_......属性中存在的内容。

如果能够将数据框中不用于绘图但仅在TOOLTIP中可用的数据添加到ggplot中,那就太好了。 如果我找到方法,我也会在这里发布

我以这种方式添加了只在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) 

  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 提示框中添加包含在输入数据集中但不直接在可视化中的数据)

关键是链接到另一个数据集的唯一 !!!,以及在 ggvis() 之外返回数据和信息以在提示框中显示的函数。

我将我的代码更改为:

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
  }
})

这样您就可以随心所欲地更改提示信息!

输入图像描述


而且,如果您将两种方式(悬停 -> 摘要信息和单击 -> 所有信息)结合起来,效果会更好:

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") %>%

(对于回答如此冗长表示抱歉)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接