7

以下の例では、インタラクティブな光沢のある 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")]
   })
})
4

2 に答える 2

11

に提供される無名関数でlongキーが現在null であるため、追加する必要があります。data$longadd_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")]
  })
})
)

ここに画像の説明を入力

于 2014-07-25T15:59:07.583 に答える
11

私もしばらくの間、これについて困惑してきました。ggvis() データ内にあるTOOLTIP情報しか取得できないようです。したがって、ggvis(~wt, ~mp) があれば、ツールチップに wt と mp を表示できます。ggvis(~wt, ~mpg, fill= ~long) がある場合、ツールチップに wt, mp , long を表示できます。または、layer_.....(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_..... プロパティのいずれかにあるものを追加できます。

プロットでは使用されていないが、 TOOLTIPでのみ使用可能なデータフレーム データを ggplot に追加できればいいと思います。方法が見つかったら、ここにも投稿します

この方法で(前の例に基づいて)ツールチップにのみ表示される非表示の名前情報を追加しました。

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

より優れた、より安定したソリューションの提案は大歓迎です! ;^)


OK、私はggvisプロットにないツールチップにすべてのデータを表示する方法を見つけました:

キーはユニークです!!! TOOLTIPに表示するデータと情報を返す別のデータセットと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
  }
})

このようにして、ツールチップ情報をあらゆる方法で変更できます。

ここに画像の説明を入力


そして、次のように 2 つを組み合わせることができる場合 (ホバー -> 概要情報 && クリック -> すべての情報) を TOP にします。

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

(長い回答で申し訳ありません)

于 2015-08-05T13:58:42.907 に答える