2017-03-28 99 views
3

我修改了R Shiny图库中的交互式R Shiny阴谋以绘制交互式标准曲线。我想绘制交互式绘图而不使用ggplot2库,只使用R基绘图功能。交互式R使用和不使用ggplot的闪亮阴谋

library(ggplot2) 

XYdata <- data.frame(cbind(Values = c(91.8, 95.3, 99.8, 123.3, 202.9, 619.8, 1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1), 
          Concn = c(1000, 300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01, 0))) 
ui <- fluidPage(
    fluidRow(
    column(width = 6, 
      plotOutput("plot1", height = 350, 
         click = "plot1_click", 
         brush = brushOpts(
         id = "plot1_brush" 
        ) 
      ), 
      actionButton("exclude_toggle", "Toggle points"), 
      actionButton("exclude_reset", "Reset") 
    ) 
) 
) 

server <- function(input, output) { 
    # For storing which rows have been excluded 
    vals <- reactiveValues(
    keeprows = rep(TRUE, nrow(XYdata)) 
) 
    NonScientific <- function(l) {l <- format(l, scientific = FALSE); parse(text=l)} 

    output$plot1 <- renderPlot({ 
    # Plot the kept and excluded points as two separate data sets 

    XYdata <- data.frame(cbind(Values = c(91.8, 95.3, 99.8, 123.3, 202.9, 619.8, 1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1), 
          Concn = c(1000, 300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01, 0))) 
    keep <- XYdata[ vals$keeprows, , drop = FALSE] 
    exclude <- XYdata[!vals$keeprows, , drop = FALSE] 
    keep <- subset(keep, Concn > 0) 
    exclude <- subset(exclude, Concn > 0) 
    nls.fit <- nls(Values ~ (ymax* keep$Concn/(ec50 + keep$Concn)) + Ns*keep$Concn + ymin, data=keep, 
        start=list(ymax=max(keep$Values), ymin = min(keep$Values), ec50 = 3, Ns = 0.2045514)) 
    keep$nls.pred <- fitted(nls.fit) 

    ggplot(keep, aes(y = Values,x = Concn))+geom_point(size = 5,colour="red")+ 
    geom_smooth(method = "loess",fullrange = F, se = T, aes(Concn, nls.pred),size = 1.5,colour="blue1")+ 
     geom_point(data = exclude, shape = 21, fill = NA, color = "black",size = 5, alpha = 0.7) + 
     xlab('Concentration (nM)')+ ylab('Units')+ 
     scale_x_log10(labels=NonScientific)+ggtitle("Standard Curve")+theme_classic()+ 
     theme(panel.background = element_rect(colour = "black", size=1), 
      plot.margin = margin(1, 3, 0.5, 1, "cm"), 
      plot.title = element_text(hjust = 0, face="bold",color="#993333", size=16), 
      axis.title = element_text(face="bold", color="#993333", size=14), 
      axis.text.x = element_text(face="bold", color="#666666", size=12), 
      axis.text.y = element_text(face="bold", color="#666666", size=12)) 
    }) 

    # Toggle points that are clicked 
    observeEvent(input$plot1_click, { 
    res <- nearPoints(XYdata, input$plot1_click, allRows = TRUE) 

    vals$keeprows <- xor(vals$keeprows, res$selected_) 
    }) 

    # Toggle points that are brushed, when button is clicked 
    observeEvent(input$exclude_toggle, { 
    res <- brushedPoints(XYdata, input$plot1_brush, allRows = TRUE) 

    vals$keeprows <- xor(vals$keeprows, res$selected_) 
    }) 

    # Reset all points 
    observeEvent(input$exclude_reset, { 
    vals$keeprows <- rep(TRUE, nrow(XYdata)) 
    }) 

} 

shinyApp(ui, server) 

我试着用下面的代码替换脚本的绘图部分,但是我不能交互式绘图。我在这里做错了什么?

plot(Values ~ Concn, keep, subset = Concn > 0, col = 4, cex = 2, log = "x") 
title(main = "XY Std curve") 
lines(predict(nls.fit, new = list(Concn = Concn)) ~ Concn, keep) 
points(Values ~ Concn, exclude, subset = Concn > 0, col = 1, cex = 2, log = "x") 

回答

3

你必须xvaryvar参数添加到nearPoints

res <- nearPoints(XYdata, input$plot1_click, xvar="Concn", yvar="Values", allRows = TRUE) 
+0

嗨@HubertL,你的建议奏效。我现在面临的唯一问题是我无法用更加详细的方式覆盖轴标题。你能看看下面的代码吗?无论我做什么,它都会写出“Concn”和“Values”引起混乱。有什么建议吗? – RanonKahn

+0

只需将这些参数添加到绘图调用'ylab =“”,xlab =“”' – HubertL

0

实施@ HubertL的建议,对于像我这样要使用交互式绘图,并通过点击或敲除离群的工作代码使用鼠标选择要点:

XYdata <- data.frame(cbind(Values = c(91.8, 95.3, 99.8, 123.3, 202.9, 619.8, 1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1), 
          Concn = c(1000, 300, 100,30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01, 0))) 
ui <- fluidPage(
    fluidRow(
    column(width = 6, 
      plotOutput("plot1", height = 350,click = "plot1_click", brush = brushOpts(id = "plot1_brush")), 
      actionButton("exclude_toggle", "Toggle points"), 
      actionButton("exclude_reset", "Reset") 
    ) 
) 
) 

server <- function(input, output) { 
    # For storing which rows have been excluded 
    vals <- reactiveValues(
    keeprows = rep(TRUE, nrow(XYdata)) 
) 
    NonScientific <- function(l) {l <- format(l, scientific = FALSE); parse(text=l)} 

    output$plot1 <- renderPlot({ 
    # Plot the kept and excluded points as two separate data sets 

    XYdata <- data.frame(cbind(Values = c(91.8, 95.3, 99.8, 123.3, 202.9, 619.8, 1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1), 
          Concn = c(1000, 300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01, 0))) 
    keep <- XYdata[ vals$keeprows, , drop = FALSE] 
    exclude <- XYdata[!vals$keeprows, , drop = FALSE] 
    keep <- subset(keep, Concn > 0) 
    exclude <- subset(exclude, Concn > 0) 
    o <- order(keep$Concn) 
    keep <- keep[o, ] 
    fo <- Values ~ (ymax* Concn/(ec50 + Concn)) + Ns * Concn + ymin 
    st <- list(ymax=max(keep$Values), ymin = min(keep$Values), ec50 = 3, Ns = 0.2045514) 
    nls.fit <- nls(fo, data = keep, start = st) 
    plot(Values ~ Concn, keep, subset = Concn > 0, type = 'p',pch = 16,cex = 2, axes = FALSE, frame.plot = TRUE,log = "x") 
    title(main = "Interactive Std curve") 
    logRange <- with(keep, log(range(Concn[Concn > 0]))) 
    x <- exp(seq(logRange[1], logRange[2], length = 250)) 
    lines(x, predict(nls.fit, new = list(Concn = x))) 
    points(Values ~ Concn, exclude, subset = Concn > 0, col = 1, cex = 2) 
    my.at <- 10^(-2:3) 
    axis(1, at = my.at, labels = formatC(my.at, format = "fg")) 
    axis(2) 
    }) 

    # Toggle points that are clicked 
    observeEvent(input$plot1_click, { 

    res <- nearPoints(XYdata, input$plot1_click, xvar="Concn", yvar="Values", allRows = TRUE) 
    vals$keeprows <- xor(vals$keeprows, res$selected_) 
    }) 

    # Toggle points that are brushed, when button is clicked 
    observeEvent(input$exclude_toggle, { 
    res <- brushedPoints(XYdata, input$plot1_brush, allRows = TRUE) 

    vals$keeprows <- xor(vals$keeprows, res$selected_) 
    }) 

    # Reset all points 
    observeEvent(input$exclude_reset, { 
    vals$keeprows <- rep(TRUE, nrow(XYdata)) 
    }) 

} 

shinyApp(ui, server) 

Interactive Curve Plot