У меня есть cowplot
, как показано ниже, с разными ggplot2
сюжетами внутри.
plot_list <- list()
plot_list[["P1"]] <- ggplot2::ggplot(mtcars, ggplot2::aes(x = mpg, y = drat)) + ggplot2::geom_point()
plot_list[["P2"]] <- ggplot2::ggplot(mtcars, ggplot2::aes(x = mpg, y = qsec)) + ggplot2::geom_point()
plot_list[["P3"]] <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp, y = drat)) + ggplot2::geom_point()
plot_list[["P4"]] <- ggplot2::ggplot(mtcars, ggplot2::aes(x = disp, y = qsec)) + ggplot2::geom_point()
P <- cowplot::plot_grid(plotlist=plot_list, ncol=1)
grDevices::pdf(file = "test_all.pdf", height=10, width=20)
print(P)
grDevices::dev.off()
который производит:
Теперь я хочу создать график с ggplot2
, то есть просто цветными рамками с текстом, чтобы «сгруппировать» график выше. Подумайте только о полосках face_wrap()
(но большего размера) с strip.position = "left"
. Так:
так, чтобы блоки занимали то же относительное вертикальное пространство, что и основные участки:
Моя конечная цель — разместить эти два графика (полосы и основной график) рядом в приложении Shiny, чтобы полосы были зафиксированы, а основной график можно было прокручивать (только по оси X). Вот почему я не хочу использовать facet_wrap
.
Поскольку вы планируете добавить свои графики в блестящее приложение, одним из вариантов может быть создание ваших блоков как отдельных ggplot
, используя rect
и text
, которые затем можно будет расположить в блестящем приложении в виде столбцов:
library(shiny)
library(ggplot2)
library(cowplot)
ui <- fluidPage(
fluidRow(
column(1, plotOutput("box1")),
column(1, plotOutput("box2")),
column(10, plotOutput("plot"))
),
tags$head(
tags$style(HTML(
"div.col-sm-1 { padding-right: 5px; padding-left: 0;}"
))
)
)
server <- function(input, output, session) {
output$box1 <- renderPlot({
ggplot() +
annotate(
geom = "rect",
xmin = -Inf, xmax = Inf,
ymin = -Inf, ymax = Inf,
fill = "grey65",
color = "black",
linewidth = 2
) +
annotate(
geom = "text",
label = "mpg", x = 0, y = 0,
size = 36 / .pt, color = "white"
) +
theme_void()
})
output$box2 <- renderPlot({
labels <- c("drat", "qsec", "drat", "qsec")
lapply(seq_along(labels), \(x) {
ggplot() +
annotate(
geom = "rect",
xmin = -Inf, xmax = Inf,
ymin = -Inf, ymax = Inf,
fill = if (x %% 2 == 0) "grey85" else "grey95",
color = "black",
linewidth = 2
) +
annotate(
geom = "text",
label = labels[[x]], x = 0, y = 0,
angle = 90, size = 24 / .pt, color = "black"
) +
theme_void()
}) |>
cowplot::plot_grid(plotlist = _, ncol = 1)
})
output$plot <- renderPlot({
P
})
}
shinyApp(ui, server)
#>
#> Listening on http://127.0.0.1:7228
plot_label <- function(label, col = "black", size=1, fill = "grey", angle=0) {
cowplot::ggdraw() +
cowplot::draw_label(label, color = col, angle=angle) +
theme(panel.border = element_rect(colour = "black", fill=NA, size=size),
panel.background = element_rect(fill=fill),
plot.margin=unit(c(1,1,1,1), "mm"))
}
P1 <- plot_label("mpg", fill = "grey50", col = "white")
P2 <- plot_label("disp", fill = "grey", angle=90)
P3 <- plot_label("hp", fill = "grey90", angle=90)
P4 <- plot_label("drat", fill = "grey", angle=90)
P5 <- plot_label("qsec", fill = "grey90", angle=90)
cowplot::plot_grid(plotlist=list(P1,
plot_grid(plotlist=list(P2, P3, P4, P5), ncol=1),
P), ncol=3, rel_widths=c(1,1,10))
это очень удобно, мне все равно нужно построить график блоков отдельно, но здесь также содержится этот ответ! Спасибо