Блестящий - организовать большое количество участков в один участок - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над блестящим приложением, которое берет простой ввод (I1) и создает из него большое количество (N1> 100) графиков (используя ggplot2). Я хочу расположить участки в сетке. Количество строк в этой сетке является фиксированным (N2), но количество столбцов (N3) будет зависеть от ввода (I1), предоставленного пользователем. Мне удалось получить желаемый результат, но вычисление занимает слишком много времени, и я ищу более быстрый способ сделать это.

До сих пор я пробовал следующие пакеты R, чтобы объединить графики в один график сетки: cowplot, gridExtra, ggplot2 (facet_wrap, facet_grid), plotly. Но все они работали слишком медленно, чтобы быть полезными.

Моя следующая идея - каким-то образом объединить все эти графики за пределами R, но я не уверен, как go об этом. У кого-нибудь есть идеи, как обработать большое количество графиков в структурированный одиночный график?

Вот пример версии приложения и моей текущей реализации с cowplot:

library(ggplot2)
library(gridExtra)
library(shiny)
library(shinyBS)
library(shinyWidgets)
library(cowplot)

ui =   fluidPage(
  sidebarLayout(
    sidebarPanel(
      style = "position:fixed;width:inherit;",
      textInput(inputId = "I1", label = "Input1", value = 1),
      actionBttn(inputId = "StartPlot", label = "Plot", style = "jelly",
                 color = "primary", size = "s"),
      width=2
    ),

    # Show a plot of the generated distribution
    mainPanel(
      imageOutput("mainPlot", click = clickOpts(id="plot_click")),
    )
  )
)

server = function(input, output, session) {
  plotWidth = 1350
  plotHeight = 6000
  plotQuality = 1

  randomPlots = function(n = 100) {
    l = list()
    for(i in 1:n) {
      data = data.frame(runif(n = 1000), runif(n = 1000))
      colnames(data) = c("x", "y")
      l[[i]] = ggplot(data = data, aes(x = x, y = y)) + geom_point()
    }
    l
  }

  # Create Plots and store as reactive
  plotsReactive = reactive({
    req(input$StartPlot)
    p <- randomPlots()
    p
  })

  # Arrange plots in a grid
  plotGridReactive = reactive({
    req(plotsReactive())

    plotList = plotsReactive()

    print(do.call(plot_grid, plotList))
  })

  # Render Grid Plot
  output$mainPlot <- renderImage({
    # A temp file to save the output.
    # This file will be removed later by renderImage
    outfile <- tempfile(fileext = '.png')

    # Generate the PNG
    png(outfile,
        # width = plotWidth * plotQuality,
        # height = plotHeight * plotQuality,
        width = plotWidth,
        height = plotHeight,
        res = 72*plotQuality
        )
    plotGridReactive()
    dev.off()

    # Return a list containing the filename
    list(src = outfile,
         contentType = 'image/png',
         width = plotWidth,
         height = plotHeight,
         res = 72*plotQuality,
         alt = "This is alternate text")
  }, deleteFile = TRUE)

}

shinyApp(ui, server)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...