通过gather()进行分面时,ggplot数据的brushedPoints错误

时间:2019-01-21 14:16:06

标签: r ggplot2 shiny facet

我一直通过多面数据在Shiny中祝好运。我创建了图,并在图下方的表中显示了选定的(即刷过的)数据。

我最近尝试对稍微复杂一些的数据执行相同的操作。我想在数据中选择一个字段,然后针对该字段生成所有数据的图。我通过this Stack Overflow post 学习了如何做到这一点。

当我将其放入应用程序时,它似乎可以正常工作,除了我注意到在某些绘图上,1)当我尝试选择所有点时,没有一个点出现(如下),或者

All points selected, but none shown in table

... 2)如果我尝试选择空白区域,则所有数据都被选中(如下)。

Empty space selected, but all data shown in table

在我看来,笔刷坐标未正确转换为数据坐标。例如,以下是“ disp”图中的一些数据,显示为失败(按值排序-最小值为71.1):

mpg  var value
33.9 disp  71.1
30.4 disp  75.7
32.4 disp  78.7
27.3 disp  79.0
30.4 disp  95.1
22.8 disp 108.0

当我尝试选择显示图中的所有点(即第一张图像)时,笔刷的值都低于(xmin,xmax,ymin和ymax都与我的选择匹配)。但是,我不知道如何将绘制的框坐标转换为数据选择-我真的不在这里了:

> fancybrush
$`xmin`
[1] 51.18154
$xmax
[1] 482.1583
$ymin
[1] 9.225
$ymax
[1] 35.075
$panelvar1
[1] "disp"
$coords_css
$coords_css$`xmin`
[1] 721
$coords_css$xmax
[1] 898
$coords_css$ymin
[1] 24.24657
$coords_css$ymax
[1] 121.9497
$coords_img
$coords_img$`xmin`
[1] 721
$coords_img$xmax
[1] 898
$coords_img$ymin
[1] 24.24657
$coords_img$ymax
[1] 121.9497
img_css_ratio
$img_css_ratio$`x`
[1] 1
$img_css_ratio$y
[1] 1
$mapping
$mapping$`x`
[1] "value"
$mapping$y
[1] "mpg"
$mapping$panelvar1
[1] "var"
$domain
$domain$`left`
[1] -23.6
$domain$right
[1] 495.6
$domain$bottom
[1] 9.225
$domain$top
[1] 35.075
$range
$range$`left`
[1] 690.2876
$range$right
[1] 903.5204
$range$bottom
[1] 121.9497
$range$top
[1] 24.24657
$log
$log$`x`
NULL
$log$y
NULL
$direction
[1] "xy"
$brushId
[1] "fancybrush"
$outputId
[1] "fancyPlot"

这对我来说有点麻烦,但是我似乎已经足够亲密了,我很确定这是可能的。如果有人能建议我可能需要做些什么来解决它,我很想听听您的消息。

下面是我可以制作的最小的,可重现的示例代码,它说明了“简单”构面(可正常工作)在“花式”构面正上方,但失败了。在一些地方设置了全局变量,以便可以看到这些值。

很长一段时间后的道歉-希望我尽可能清楚。感谢您阅读本文。

library(shiny)
ui <- fluidPage(
  div(h1("Simple Facet"),p("These plots facet mtcars by CYL", plotOutput("simpleFacetPlot",brush = "simplebrush"), dataTableOutput("simpleFacetTable"))),
  div(h1("Fancy Facet"),p("These plots plot all other columns against MPG", plotOutput("fancyPlot",brush = "fancybrush"), dataTableOutput("fancyTable")))
)
server <- function(input, output) {
  ##### functions to get the data
  getSimpleData <-function(){
    thisData = mtcars
    thisData<<-thisData
    return(thisData)
  } 
  getFancyData <-function(coreField = NULL){
    thisData = mtcars
    thisData = thisData[!is.na(thisData[coreField]),]
    thisDataRes = thisData %>% gather(-coreField , key = "var", value = "value")  
    thisDataRes<<-thisDataRes
    return(thisDataRes)
  }
  #####  blocks to watch for the selections
  simpleSelected <- reactive({
    input$simplebrush
    thisSimpleData = getSimpleData()
    simpleBrushed=brushedPoints(thisSimpleData,
                          input$simplebrush,
                          xvar = "wt",
                          yvar = "mpg")
    return(simpleBrushed)
  })
  fancySelected <- reactive({
    input$fancybrush
    fancybrush<<-input$fancybrush
    thisFancyData = getFancyData(coreField = 'mpg')
    fancyBrushed=brushedPoints(thisFancyData,
                          input$fancybrush,
                          xvar = "var",
                          yvar = "mpg")
    return(fancyBrushed)
  })

 ##### blocks to generate the plots
  output$simpleFacetPlot <- renderPlot({
    #just force faceting on cylinder for the simple plot
    simpleFacetPlot = ggplot(data = getSimpleData(), aes(x = wt, y = mpg)) + geom_point() + facet_wrap(~ cyl) 
    return(simpleFacetPlot)
  })
  output$fancyPlot <- renderPlot({
    fancyPlot <- ggplot(data = getFancyData(coreField = 'mpg'), aes(x = value, y = mpg)) + geom_point() + facet_wrap(~ var) 
    return(fancyPlot)
  })

  #####blocks to print the selection output
  output$fancyTable <- renderDataTable({
    return(fancySelected())
  })  
  output$simpleFacetTable <- renderDataTable({
    return(simpleSelected())
  })

}

shinyApp(ui = ui, server = server)

0 个答案:

没有答案