使用 ggplot facet_grid 或 facet_wrap 时修改面板轴的特定主题参数

Posted

技术标签:

【中文标题】使用 ggplot facet_grid 或 facet_wrap 时修改面板轴的特定主题参数【英文标题】:Modifying specific theme parameters of panel axes when using ggplot facet_grid or facet_wrap 【发布时间】:2021-10-08 04:54:10 【问题描述】:

问题

使用 ggplot 的 facet_gridfacet_panel 创建子图通常很方便,而不是使用网格/cowplot 等替代包。但是,我发现自定义各个方面的特定主题属性是一个难以捉摸的过程。许多人提出了关于修改轴刻度的问题,并且有很多解决方案。

但是,我想知道如何可以很好地控制各个面板轴的主题参数。例如,假设我想将面板 x 的刻度标签设置为透明或与其他面板的字体大小不同。

虽然我的直接问题是消除刻度标签(同时保留 y 轴线和刻度线,因此 scales = free),但我对控制特定面板的主题元素的更通用的解决方案感兴趣使用facet_gridfacet_wrap 时。具体来说,我想知道是否有任何方法可以在不使用 gtable/grobs 等的情况下修改单个面板的特定主题属性,尤其是轴的属性。

关于手头的问题,这是我尝试实施一种 hack 来“擦除”右侧子图的刻度标签,但似乎轴文本层优先于 geoms 等不包括。在实践中,填充颜色应该是白色的,但为了便于说明,我在这里将其设为黑色。

尝试的解决方案

library(egg)
library(ggplot2)


df.rect <- data.frame(Species = c("setosa", "versicolor", "virginica"),
                      xmin = c(4.60,4.60,NA), 
                      xmax = c(4.89,4.89,NA), 
                      ymin = c(-0.05,-0.05,NA), 
                      ymax = c(1.55,1.55,NA)) 
p1 <- ggplot(data = iris, aes(x = Sepal.Width, fill = Species)) +
  facet_wrap(. ~Species, scales = "free", ncol = 4) +
  geom_density(alpha = 0.30) +
  theme_classic() +
  labs(x = "Sepal Length", y = "Density", fill = "Species") +
  coord_cartesian(xlim = c(1.95,4.45), ylim = c(-0.05,1.55), clip = "off") +
  scale_x_continuous(breaks = seq(2,4.4,0.6)) +
  scale_y_continuous(breaks = seq(0,1.5,0.30)) +
  theme(legend.title = element_text(size = 9),
        legend.text = element_text(size = 9),
        legend.title.align = 0,
        strip.background = element_blank(),
        strip.text = element_blank(),
        axis.title.x = element_text(margin = unit(c(3,0,0,0), "mm"), size = 10),
        axis.title.y = element_text(margin = unit(c(0,3,0,0), "mm"), size = 10),
        panel.spacing.x = unit(4, "mm")) 
p1 <- tag_facet(p1)
p1 <- p1 + geom_rect(data = df.rect, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), color = "white", fill = "black", inherit.aes = FALSE)
p1

结果

【问题讨论】:

【参考方案1】:

我认为您不能在每个面板的基础上控制主题元素。为此,您可能需要的是 (1) 具有独立于全局主题的可自定义主题元素的轴指南,以及 (2) 为每个面板单独设置轴指南的方法。据我所知,(2)does exist,但(1)没有。

关于您的具体问题,我知道有两个包装可以去除内板上的标签。以下是两者的示例,如果秤是免费的,两者都拒绝删除标签。 lemon 包有一个专门的 facet 函数:

library(ggplot2)

g <- ggplot(data = iris, aes(x = Sepal.Width, fill = Species)) +
  geom_density(alpha = 0.30) +
  theme_classic()

library(lemon)
#> 
#> Attaching package: 'lemon'
#> The following objects are masked from 'package:ggplot2':
#> 
#>     CoordCartesian, element_render

g + facet_rep_wrap(~ Species, ncol = 4)

ggh4x 包具有支持此功能的可选参数。

library(ggh4x)
#> 
#> Attaching package: 'ggh4x'
#> The following objects are masked from 'package:lemon':
#> 
#>     geom_pointpath, GeomPointPath

g + facet_wrap2(~ Species, ncol = 4, 
                axes = "full", remove_labels = "all")

由reprex package (v2.0.0) 于 2021-08-03 创建

免责声明:我是 ggh4x 的作者。

【讨论】:

让 Q 保持打开状态,直到我们可以确认 '(1)' 是否存在。我最终选择了柠檬包。

以上是关于使用 ggplot facet_grid 或 facet_wrap 时修改面板轴的特定主题参数的主要内容,如果未能解决你的问题,请参考以下文章

ggplot:如何使用 facet_grid 创建不同的 x 轴标题

如何使用 ggplot_build 和 ggplot_gtable 调整 facet_grid 框架和箱线图之间的距离

使用 facet_grid 在 ggplot 中自动设置数据代表中断

ggplot2:从图中删除未使用的因子水平组合的方面(facet_grid)

如何使用不同的几何图形将边际总计添加到 ggplot2 facet_grid 图

R ggplot facet_grid多箱图