Tuesday, April 12, 2016

unable to draw linear line in ggplot2

Leave a Comment

I am uploading csv file into a via shiny and trying to draw ggplot from the selected columns.

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) } 

I can create the chart but when I try to add

+geom_smooth(method="lm") 

I am not getting the lm line any ideas what might be happening?

given a data set like this:

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)) 

I tried to do:

plot(xy~yv, data=df) 

I don't see anything. But to test it, when I do the following, it works. I was not able to find out what the problem is. Again, I am uploading a file to shiny app to plot and create models. Any ideas?

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

1 Answers

Answers 1

Your problem is minor: geom_smooth() does not reference any data. Set the aesthetics aes() universally inside ggplot() instead of just in geom_point(). The reproducible example below simply cut-and-pastes the line to the correct location.

First, we'll write mtcars into a csv file to load into shiny:

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

Second, run this code:

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

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment