Я работаю над блестящим приложением, которое берет простой ввод (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)