如何为每个ggplot面板单独格式化坐标轴刻度标签?

3

我需要创建一个多面板图,其中y轴(因子)的刻度标签在某些面板上为斜体,在其他面板上为普通文本。

以下是一个可复制的示例,使用虚构数据,展示了我尝试过的一件事:

library(ggplot2)
## Example data
df <- data.frame(var = c("Grass cover", "River depth", "Canis familiaris", "Canis lupus", "Canis latrans"), 
                 coef = c(0.6, 0.4, 0.8, 0.1, 0.5),
                 se = c(0.3, 0.4, 0.4, 0.05, 0.2),
                 panel = c(rep("Environment", 2), rep("Canid abundance", 3)))
## multi-panel plot
ggplot(df, aes(y = var, x = coef, xmin = coef - se, xmax = coef + se)) + 
  geom_pointrange() +
  facet_wrap(~ panel, scales = "free_y", ncol = 1) +
  labs(y = NULL) +
  theme(axis.text.y = element_text(face = c(rep("plain", 2), rep("italic", 3))))

多面板绘图

注意,只有顶部面板中的 "Canis lupus" 是斜体的。期望的图形应该有第一个面板中所有的科学名称(y轴标签)都是斜体,但底部面板的标签应该是普通字体。在真实数据中,我有4个面板,其中2个需要斜体。

似乎 element_text() 中向量化的 face 参数在面板之间被循环使用。我也尝试过 axis.text.y = element_text(face = rep("italic", 3), c(rep("plain", 2))),这会导致所有5个y轴标签都是斜体。

如果可能的话,我希望不使用多个ggplot对象(例如grid_arrange()cowplot())。不过,我愿意接受任何允许调整所有视觉格式元素的解决方案。


我认为可以使用expression()来解决问题,但我还没有想出方法。


如果您无法在ggplot2中找到所需的内容,可以考虑使用ggtreegithub)包,该包支持标签和其他内容中的Markdown。 - r2evans
2个回答

4

这里还有另一个选项。

library(tidyverse)

df <- tibble(var = c("Grass cover", "River depth", "Canis familiaris", "Canis lupus", "Canis latrans"),
             coef = c(0.6, 0.4, 0.8, 0.1, 0.5),
             se = c(0.3, 0.4, 0.4, 0.05, 0.2),
             panel = c(rep("Environment", 2), rep("Canid abundance", 3)))

df %>%
  mutate(lab = map2_chr(var, panel, 
                        ~ifelse(.y == "Canid abundance", 
                                paste0('italic("', .x,'")'), 
                                paste0('"', .x,'"')))) %>%
  ggplot(aes(y = lab, x = coef, xmin = coef - se, xmax = coef + se)) + 
  geom_pointrange() +
  facet_wrap(~ panel, scales = "free_y", ncol = 1) +
  labs(y = NULL) +
  scale_y_discrete(label = function(x) parse(text = x))


2

实现您所需的结果的一种选择是利用ggtext包,该包允许使用markdown语法和/或HTML/CSS来样式化标签和主题元素。

  1. 使用theme(axis.text.y = ggtext::element_markdown()),y轴标签将被解析为markdown代码。
  2. 将要显示的标签包装在* ... *中以呈现斜体。
library(ggplot2)
library(ggtext)

df <- data.frame(var = c("Grass cover", "River depth", "Canis familiaris", "Canis lupus", "Canis latrans"), 
                 coef = c(0.6, 0.4, 0.8, 0.1, 0.5),
                 se = c(0.3, 0.4, 0.4, 0.05, 0.2),
                 panel = c(rep("Environment", 2), rep("Canid abundance", 3)))
df$var <- ifelse(df$panel %in% "Canid abundance", paste0("*", df$var, "*"), df$var)

## multi-panel plot
ggplot(df, aes(y = var, x = coef, xmin = coef - se, xmax = coef + se)) + 
  geom_pointrange() +
  facet_wrap(~ panel, scales = "free_y", ncol = 1) +
  labs(y = NULL) +
  theme(axis.text.y = ggtext::element_markdown())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接