【问题标题】:unable to draw linear line in ggplot2无法在ggplot2中绘制直线
【发布时间】:2016-03-31 15:36:06
【问题描述】:

我正在将 csv 文件上传到 via shiny 并尝试从选定的列中绘制 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")

我对 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

【问题讨论】:

  • 如果您使用aes_string,您不是更愿意使用x="xv" 吗?只是为了确认其他事情,我知道method="auto" 没有区别,情节没有显示?最后一件事,如果两个 geoms 使用相同的 aes,不应该在最初的 ggplot 调用中提供 aes_string 吗?
  • 我会尝试:ggplot(data=mdf, aes_string(x="xv",y="value",color="variable")) + geom_point() + geom_smooth(method="auto"),只是为了检查它是否有所作为
  • @Konrad,我试过了,没区别,无法让 geom_smooth 正常工作
  • 第二次修改aes怎么样?
  • 请在ggplot 行之前插入message(str(mdf)),然后查看控制台上打印的内容。

标签: r ggplot2 shiny


【解决方案1】:

您的问题很小: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)
      }
    )
  }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多