R: facet_wrap does not render correctly with ggplotly in Shiny app

前端 未结 1 1043
面向向阳花
面向向阳花 2021-01-14 08:23

When I do a facet_grid in ggplotly() for a Shiny App, with a large number of faceting groups, the plot is messed up. However it works correctly outside Shiny.

How ca

相关标签:
1条回答
  • 2021-01-14 08:50

    The first thing to note is that the problem has nothing to do with Shiny but rather your use of ggplotly. The problem can be replicated with just:

    library(ggplot2)
    library(plotly)
    
    data(diamonds, package = "ggplot2")
    
    # new faceting group
      diamonds$rdmGroup <- as.factor(sample(LETTERS, dim(diamonds)[1], replace=TRUE))
    
    # subset of diamonds   
      diamonds <- diamonds[sample(nrow(diamonds), 1000),]
    
    p <- ggplot(diamonds , aes_string(x = diamonds$x, y = diamonds$y, color = diamonds$x)) + 
          geom_point() + facet_grid(rdmGroup~.)
    
    ggplotly(p)
    

    though you will need something to view the output in, which may well be shiny.

    In answer to your question, the problem seems to be that you cannot have more than 25 facets. If you remove any single group from rdmGroup then the plotly output works fine e.g.

    diamonds <- subset(diamonds, rdmGroup != "Q")
    

    To update your shiny example:

    library(shiny)
    library(plotly)
    library(ggplot2)
    
    data(diamonds, package = "ggplot2")
    
    # new faceting group
    diamonds$rdmGroup <- as.factor(sample(LETTERS, dim(diamonds)[1], replace=TRUE))
    
    # subset of diamonds   
    diamonds <- diamonds[sample(nrow(diamonds), 1000),]
    diamonds <- subset(diamonds, rdmGroup != "Q")
    
    ui <- fluidPage(
      headerPanel("Diamonds Explorer"),
      sidebarPanel(
        sliderInput('plotHeight', 'Height of plot (in pixels)', 
                    min = 100, max = 2000, value = 1000) 
      ),
      mainPanel(
        plotlyOutput('trendPlot')
      )
    )
    
    
    server <- function(input, output) {
    
      output$trendPlot <- renderPlotly({ 
        p <- ggplot(diamonds, aes_string(x = diamonds$x, y =diamonds$y, color = diamonds$x)) + 
          geom_point()+ facet_grid(rdmGroup~., scales = "free_y") +
          labs(x = "X", y="Y")
    
        ggplotly(p) %>% 
          layout(height = input$plotHeight, autosize=TRUE)
      })
    }
    shinyApp(ui, server)
    

    provides the following output: output

    A workaround could be to simply have more than one plot, splitting the dataset into groups of 25.

    EDIT: I did some more research and the plot stops displaying as expected when the panel margins are too large to allow all of the plots to display. You can display all 26 by reducing the panel.spacing.y but this will only go so far depending on how many rows you need:

    p <- ggplot(diamonds, aes_string(x = diamonds$x, y =diamonds$y, color = diamonds$x)) + 
      geom_point()+ facet_grid(rdmGroup~., scales = "free_y") +
      labs(x = "X", y="Y") + theme(panel.spacing.y = unit(0.2, "lines"))
    
    0 讨论(0)
提交回复
热议问题