ggedit is a package that lets users interactively edit ggplot layer and theme aesthetics. In a previous post we showed you how to use it in a collaborative workflow using standard R scripts. More importantly, we highlighted that ggedit outputs to the user, after editing, updated: gg plots, layers, scales and themes as both self-contained objects and script that you can paste directly in your code.
Installation
devtools::install_github('metrumresearchgroup/ggedit',subdir='ggedit')
version 0.1.1 Updates
- ggEdit Shiny module: use ggedit as part of any Shiny application.
- gggsave: generalized ggsave to write multiple outputs of ggplot to a single file and/or multiple files from a single call. Plots can be saved to various graphic devices.
ggEdit Shiny module
This post will demonstrate a new method to use ggedit, Shiny modules. A Shiny module is a chunk of Shiny code that can be reused many times in the same application, but generic enough so it can be applied in any Shiny app (in simplest terms think of it as a Shiny function). By making ggedit a Shiny module we can now replace any renderPlot() call that inputs a ggplot and outputs in the UI plotOutput(), with an interactive ggedit layout. The analogy between how to use the ggEdit module in comparison to a standard renderPlot call can be seen in the table below.Standard Shiny | Shiny Module | |
Server | output$id=renderPlot(p) |
reactiveOutput=callModule(ggEdit,id,reactive(p)) |
UI | plotOutput(id) |
ggEditUI(id) |
Source Code for example
library(ggedit) server = function(input, output,session) { p1=ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,colour=Species))+geom_point() p2=ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,colour=Species))+geom_line()+geom_point() p3=list(p1=p1,p2=p2) output$p=renderPlot({p1}) outp1=callModule(ggEdit,'pOut1',obj=reactive(list(p1=p1))) outp2=callModule(ggEdit,'pOut2',obj=reactive(p3)) output$x1=renderUI({ layerTxt=outp1()$UpdatedLayerCalls$p1[[1]] aceEditor(outputId = 'layerAce',value=layerTxt, mode = 'r', theme = 'chrome', height = '100px', fontSize = 12,wordWrap = T) }) output$x2=renderUI({ themeTxt=outp1()$UpdatedThemeCalls$p1 aceEditor(outputId = 'themeAce',value=themeTxt, mode = 'r', theme = 'chrome', height = '100px', fontSize = 12,wordWrap = T) }) } ui=fluidPage( conditionalPanel("input.tbPanel=='tab2'", sidebarPanel(uiOutput('x1'),uiOutput('x2'))), mainPanel( tabsetPanel(id = 'tbPanel', tabPanel('renderPlot/plotOutput',value = 'tab1',plotOutput('p')), tabPanel('ggEdit/ggEditUI',value = 'tab2',ggEditUI('pOut1')), tabPanel('ggEdit/ggEditUI with lists of plots',value = 'tab3',ggEditUI('pOut2')) ))) shinyApp(ui, server)
gggedit
ggsave is the device writing function written for the ggplot2 package. A limitation of it is that only one figure can be written at a time. gggsave is a wrapper of ggsave that allows for list of ggplots to be called and then passes arguments to base graphics devices to create multiple outputs automatically, without the need of loops.library(ggedit) #single file output to pdf gggsave('Rplots.pdf',plot=pList) #multiple file output to pdf gggsave('Rplots.pdf',plot=pList,onefil = FALSE) #multiple file output to png gggsave('Rplots.png',plot=pList)
Jonathan Sidi joined Metrum Research Group in 2016 after working for several years on problems in applied statistics, financial stress testing and economic forecasting in both industrial and academic settings.
To learn more about additional open-source software packages developed by Metrum Research Group please visit the Metrum website.
Contact: For questions and comments, feel free to email me at: [email protected] or open an issue in github.
Thanks for this. It would be nice to see a working example.