无法在ggplot2中绘制线性线

时间:2016-03-31 15:36:07

标签: r ggplot2 shiny

我正在将csv文件上传到一个闪亮的版本,并试图从所选列中绘制ggplot。

output$plot = renderPlot(
    {
      df <- data_set()
      gp <- NULL
      if (!is.null(df)){
        xv <- input$xaxisGrp
        yv <- input$yaxisGrp
        if (!is.null(xv) & !is.null(yv)){
          if (sum(xv %in% names(df))>0){ # supress error when changing files
            mdf <- melt(df,id.vars=xv,measure.vars=yv)
            gp <- ggplot(data=mdf) + 
              geom_point(aes_string(x=xv,y="value",color="variable"))+
              geom_smooth(method="lm")+
              theme(axis.text.x=element_text(angle=45, hjust=1))+
              theme_hc() +
              scale_colour_hc()+theme(legend.title=element_blank())

          }
        }
      }
      return(gp)
}

我可以创建图表但是当我尝试添加

+geom_smooth(method="lm")

我没有得到任何想法可能会发生什么?

给出这样的数据集:

dput(df)
structure(list(load = c(1L, 18L, 36L, 72L, 108L, 144L, 216L), 
    throughput = c(64.9, 995.9, 1652.4, 1853.2, 1828.9, 1775, 
    1702.2)), .Names = c("load", "throughput"), class = "data.frame", row.names = c(NA, 
-7L))

我试着这样做:

plot(xy~yv, data=df)

我什么也看不见。但是为了测试它,当我执行以下操作时,它可以工作。我无法找出问题所在。我再次将文件上传到闪亮的应用程序以绘制和创建模型。有什么想法吗?

plot(mtcars$mpg~mtcars$cyl) ##this works

1 个答案:

答案 0 :(得分:11)

您的问题很小:geom_smooth()未引用任何数据。将美学aes()普遍设置在ggplot()内,而不仅仅放在geom_point()中。下面的可重现的示例只需将该行剪切并粘贴到正确的位置。

首先,我们将mtcars写入csv文件以加载到shiny:

write.table(mtcars, "c://path//to//your//file.csv", row.names = TRUE, sep=",")

其次,运行此代码:

library(shiny); library(ggplot2); library(reshape2)

shinyApp(

  ui = fluidPage(
    sidebarLayout(
      sidebarPanel(
        fileInput("inputFile", "Browse for file"),  #Upload button
        #After file is uploaded, read the columns in the server function,
        # and create a responsive dropdown menu for plotting the variables
        uiOutput("plot.params")   #Responsive x and y dropdown menu
      ),
      mainPanel(
        plotOutput("plot")
        )
    )
  ), 

  server = function(input, output, session) {
    #Read in the uploaded data file and create a reactive variable called data_set
    data_set <- reactive({if(is.null(input$inputFile)) return(NULL)
      read.csv(input$inputFile$datapath, header = TRUE, sep=",")
    })

    #Create a (reactive) dropdown menu for selecting X and Y
    output$plot.params <- renderUI({ list(
      fluidRow(selectInput(inputId = "xaxisGrp", label = "X", choices = names(data_set() )) ),
      fluidRow(selectInput(inputId = "yaxisGrp", label = "Y", choices = names(data_set() )) )
    )})

    #Create a plot- copied from OP with minor edit to ggplot()
    output$plot = renderPlot(
      {
        df <- data_set()
        gp <- NULL
        if (!is.null(df)){
          xv <- input$xaxisGrp  #from the reactive ui selecInput
          yv <- input$yaxisGrp  #from the reactive ui selecInput
          if (!is.null(xv) & !is.null(yv)){
            if (sum(xv %in% names(df))>0){ # supress error when changing files
              mdf <- melt(df,id.vars=xv,measure.vars=yv)
              gp <- ggplot(data=mdf, aes_string(x=xv,y="value",color="variable")) + 
                geom_point()+  #aes() moved from here into ggplot()
                geom_smooth(method="lm")
            }
          }
        }
        return(gp)
      }
    )
  }
)

shiny fileInput with reactiveUI and geom_smooth