使用 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_grid
或 facet_panel
创建子图通常很方便,而不是使用网格/cowplot 等替代包。但是,我发现自定义各个方面的特定主题属性是一个难以捉摸的过程。许多人提出了关于修改轴刻度的问题,并且有很多解决方案。
但是,我想知道如何可以很好地控制各个面板轴的主题参数。例如,假设我想将面板 x 的刻度标签设置为透明或与其他面板的字体大小不同。
虽然我的直接问题是消除刻度标签(同时保留 y 轴线和刻度线,因此 scales = free
),但我对控制特定面板的主题元素的更通用的解决方案感兴趣使用facet_grid
或facet_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)