R:如何在ggvis闪亮应用中更改特定范围的绘图背景颜色

wsd*_*sda 6 r shiny ggvis

我有一个简单的闪亮应用程序,如下所示,你可以运行它.这些图是由ggvis用户创建的,用户可以从中选择学生姓名inputSelect.在图中,我想要更改特定分数范围内的背景颜色.例如,在每个图中,分数高于80或低于50的绘图背景颜色用蓝色突出显示(参见附图).我试图添加图层并使用绘制矩形到情节layer_rects(),但问题是如果选择不同的学生,x轴的值会改变.任何人之前做过这个或任何想法?如果我只想要那个得分范围内的积分弹出,是否有可能?非常感谢!

示例图片

  library(shiny)
    library(ggvis)

df <- data.frame(Student = c("a","a","a","a","a","b","b","b","b","b","c","c","c","c"),
                 year = c(seq(2001,2005,1),seq(2010,2014,1),seq(2012,2015,1)),
                 score = runif(14,min = 50,max = 100), stringsAsFactors=F)

ui = (fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("stu","Choose Student",
                  choice = unique(df$Student))
    ),
    mainPanel(ggvisOutput("plot"))
    )
  )
)

server = function(input,output,session){   

  dataInput = reactive({
    gg = df[which(df$Student == input$stu),]
  })

  vis = reactive({
    data = dataInput()
    data %>%
      ggvis(x = ~year, y = ~score) %>%
      scale_numeric("y",domain = c(40,120))%>%
      layer_lines()
  })

  vis %>% bind_shiny("plot")
}

runApp(list(ui = ui, server = server))
Run Code Online (Sandbox Code Playgroud)

pic*_*ick 1

要使矩形的宽度随 x 轴变量而变化,可以使用x = ~min(year)x2 = ~max(year)。我不确定如何使变量依赖于当前的规模限制,这似乎是一个更好的解决方案。但是,这应该有效。例如,下面的矩形将是

layer_rects(x = ~min(year), x2 =~max(year),
            y = 40-3.5, y2 = 50, opacity := 0.05, fill := "blue")
Run Code Online (Sandbox Code Playgroud)

它没有针对不同的限制进行矢量化(至少看起来不是),因此您可以编写一个函数来简化多个矩形的操作。整个服务器看起来像

shinyServer(function(input,output,session){   

    dataInput = reactive({
        gg = df[which(df$Student == input$stu),]
    })

    buffer <- 3.5  # set to make the rectangle reach the scale boundaries
    rectLims <- list(lower=c(40-buffer, 80), upper=c(50, 120+buffer))
    make_rect <- function(vis, lims, buffer=buffer) {
        for (i in seq_along(lims$lower))
            vis <- layer_rects(vis, x = ~min(year), x2 =~max(year),
                        y = rectLims$lower[i], y2 = rectLims$upper[i],
                               opacity := 0.05, fill := "blue")
        vis
    }

    vis = reactive({
        data = dataInput()
        data %>%
          ggvis(x = ~year, y = ~score) %>%
          scale_numeric("y",domain = c(40,120)) %>%
          layer_points()%>%
          layer_lines() %>%
          make_rect(lims=rectLims)
    })

    vis %>% bind_shiny("plot")
})
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,如果您只想在该范围内显示点,您可以制作数据的子集以用于 或layer_points逻辑向量(使用 转换为数字+)并将其用作opacity参数,

vis = reactive({
    data = dataInput()

    ## Option 1: and use layer_points(data=inrange)
    ## inrange <- with(dataInput(), dataInput()[score >=80 | score <= 50,])

    ## Options 2, with opacity=~inrange
    inrange = +with(data, score >=80 | score <= 50)

    data %>%
      ggvis(x = ~year, y = ~score) %>%
      scale_numeric("y",domain = c(40,120)) %>%
      layer_points(opacity = ~inrange) %>%
      layer_lines() %>%
      make_rect(lims=rectLims)
})
Run Code Online (Sandbox Code Playgroud)