繁体   English   中英

R: ggplot2 设置最后一个 plot 在中间与 facet_wrap

[英]R: ggplot2 setting the last plot in the midle with facet_wrap

我正在尝试使用 facet_wrap 创建一些多图。 但是,我不确定是否适合我的图表。 这是一个简短的可重现示例:

 ggplot(airquality, aes(x = Day, y = Temp)) +
  facet_wrap(~Month) + 
  geom_line()

这会在此处生成此 plot:

在此处输入图像描述

是否可以使用 facet_wrap 方法将第二行中的两个图“居中”? 请注意,我不想重新排序图,我只想将第二行居中

@Tjebo 使用cowplot图的建议将起作用:

p <- ggplot(mapping = aes(x = Day, y = Temp)) +
  facet_wrap(~Month) + 
  geom_line()

cowplot::plot_grid(
  p %+% subset(airquality, Month < 8),
  p %+% subset(airquality, Month > 7),
  nrow = 2
)

在此处输入图片说明

您还可以考虑使用egg包中的set_panel_size函数,它可以让您将多个绘图的面板大小(宽度、高度)设置为绝对测量值,有关更多详细信息,请参阅此小插图

使用 Axeman 的代码创建绘图

library(egg)
library(gridExtra)
p <- ggplot(mapping = aes(x = Day, y = Temp)) +
  facet_wrap(~Month) + 
  geom_line()

p1 <- p %+% subset(airquality, Month < 8) + labs(x = NULL)
p2 <- p %+% subset(airquality, Month > 7)

现在在指定面板大小后使用grid.arrange排列图

grid.arrange(grobs = lapply(
  list(p1, p2),
  set_panel_size,
  width = unit(5, "cm"),
  height = unit(4, "cm")
))

在此处输入图片说明

实现所需结果的另一个选择是ggh4x package ,它通过ggh4x::facet_manual通过design参数为 position 增加了一些灵活性:

library(ggplot2)
library(ggh4x)

base <- ggplot(airquality, aes(x = Day, y = Temp)) +
  geom_line()

design <- c(
"
AABBCC
#DDEE#
"
)

base + ggh4x::facet_manual(~Month, design = design)


design <- c(
"
AABBCC
DDDEEE
"
)
base + ggh4x::facet_manual(~Month, design = design)

以防万一有人想知道如何在网格中从头开始...

library(ggplot2)
library(dplyr)
library(grid)

vps <- c("top_left", "top_mid", "top_right", "bottom_left", "bottom_right")

main_vp  <- vpTree(viewport(name = "main"), vpList(
              viewport(x = 1/6, y = 0.75, width = 1/3, height = 0.5, name = vps[1]),
              viewport(x = 3/6, y = 0.75, width = 1/3, height = 0.5, name = vps[2]),
              viewport(x = 5/6, y = 0.75, width = 1/3, height = 0.5, name = vps[3]),
              viewport(x = 1/3, y = 0.25, width = 1/3, height = 0.5, name = vps[4]),
              viewport(x = 2/3, y = 0.25, width = 1/3, height = 0.5, name = vps[5])))

grid.newpage()
pushViewport(main_vp)

plots <- lapply(1:5, function(i){ 
  seekViewport(vps[i])
  invisible(grid.draw(ggplotGrob(
    
    ggplot(filter(airquality, Month == levels(as.factor(airquality$Month))[i]), 
           mapping = aes(Day, Temp)) + 
      geom_line() + 
      facet_grid(.~Month)
    
)))})

reprex 包(v0.3.0) 于 2020 年 7 月 3 日创建

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM