Search code examples
rggplot2mgcv

How does one control the appearance (e.g. line size, line type, colour) of mqgam plots produced using plot.mgamViz from the "mgcViz" package?


I am using quantile regression in R with the qgam package and visualising them using the mgcViz package, but I am struggling to understand how to control the appearance of the plots. The package effectively turns gams (in my case mqgams) into ggplots.

Simple reprex:

egfit <- mqgam(data = iris,
               Sepal.Length ~ s(Petal.Length),
               qu = c(0.25,0.5,0.75))

plot.mgamViz(getViz(egfit))

enter image description here

I am able to control things that can be added, for example the axis labels and theme of the plot, but I'm struggling to effect things that would normally be addressed in the aes() or geom_x() functions.

  1. How would I control the thickness of the line? If this were a normal geom_smooth() or geom_line() I'd simply put size = 1 inside of the geoms, but I cannot see how I'd do so here.

  2. How can I control the linetype of these lines? The "id" is continuous and one cannot supply a linetype to a continuous scale. If this were a nomral plot I would convert "id" to a character, but I can't see a way of doing so with the plot.mgamViz function.

  3. How can I supply a new colour scale? It seems as though if I provide it with a new colour scale it invents new ID values to put on the legend that don't correlate to the actual "id" values, e.g.

    plot.mgamViz(getViz(egfit)) + scale_colour_viridis_c()

enter image description here

I fully expect this to be relatively simple and I'm missing something obvious, and imagine the answer to all three of these subquestions are very similar to one another. Thanks in advance.


Solution

  • You need to extract your ggplot element using this:

    p1 <- plot.mgamViz(getViz(egfit))
    p <- p1$plots [[1]]$ggObj
    

    Then, id should be as.factor:

    p$data$id <- as.factor(p$data$id)
    

    Now you can play with ggplot elements as you prefer:

    library(mgcViz)
    
        egfit <- mqgam(data = iris,
                       Sepal.Length ~ s(Petal.Length),
                       qu = c(0.25,0.5,0.75))
    
        p1 <- plot.mgamViz(getViz(egfit))
    
        # Taking gg infos and convert id to factor
        p <- p1$plots [[1]]$ggObj
        p$data$id <- as.factor(p$data$id)
    
    
        # Changing ggplot attributes
        p <- p +
          geom_line(linetype = 3, size = 1)+ 
          scale_color_brewer(palette = "Set1")+
          labs(x="Petal Length", y="s(Petal Length)", color = "My ID labels:")+
          theme_classic(14)+
          theme(legend.position = "bottom")
        p
    

    Here the generated plot:

    enter image description here

    Hope it is useful!