如何在没有重新加载的情况下突出显示facet的ggplot上的点?

时间:2018-03-26 15:03:27

标签: r ggplot2 shiny

我想动态快速地突出显示faceted 上的点。

我的问题:图形每次都需要花费很多时间进行重新计算(图表经常会出现这种情况)。

此刻我只有两个:

  1. 为所有原始ggplot找到一种“预先计算”的方法,只修改一些红色点。
  2. 找到一种完美原始Overlaying two graphs using ggplot2 in R的方法,其中ggplot仅限于红点(这将更轻)。
  3. 参考文献:我发现了以下主题:

    但它似乎不适用于我的问题。 请在下面找到可重现的示例。非常感谢您的帮助和支持!

    ggplot

    版本1:轻松阅读代码,但更新数据时会产生重要的滞后效应

    library(shiny); library(ggplot2); library(dplyr)
    # Dataset
    data_=do.call("rbind", replicate(1000, mtcars, simplify = FALSE))
    # General graphic
    p_0=ggplot(data=data_,aes(x=wt,y=mpg))+geom_point()+facet_wrap(~carb)
    

    版本2:更好的用户体验,但难以阅读代码,使用绝对面板进行布局困难,仍然存在滞后问题

    ui=fluidPage(
                    fluidRow(
                        column(width = 12,
                        numericInput("choice", "Highlight in red when carb=",1,),
                        plotOutput("plot1"))
                    )
                    )
    
    server=function(input, output) {
        p=reactive({return(
            p_0+geom_point(data=data_ %>% filter(carb==input$choice),aes(x=wt,y=mpg),color='red')
            )})
        output$plot1=renderPlot({p()})
    }
    
    shinyApp(ui, server)
    

1 个答案:

答案 0 :(得分:0)

我认为通过做以下两件事,我在速度上有所改善:

  • 将数字输入更改为具有受限选择的选择输入框。
  • 简化了代码,仅使调色板成为反应式。

library(shiny); library(ggplot2); library(dplyr)
# Dataset
data_=do.call("rbind", replicate(1000, mtcars, simplify = FALSE))
# General graphic

ui=fluidPage(
  fluidRow(
    column(width = 12,
           selectInput("choice", "Highlight in red when carb=",1, choices = c(1:4,6,8)),
           plotOutput("plot1"))
  )
)

server=function(input, output) {

  cols <- reactive({
    cols <- c("1" = "black", "2" =  "black", "3" =  "black",
              "4" =  "black", "6" =   "black",   "8" =   "black")
    cols[input$choice] <- "red"
    return(cols)
  })

  output$plot1=renderPlot({
    ggplot(data_, aes(x=wt, y=mpg, color = as.character(carb))) +
      geom_point() +
      scale_colour_manual(values = cols()) +
      facet_wrap(~carb)
      })
}

shinyApp(ui, server)