r - 如何分别格式化每个 ggplot 面板的轴刻度标签?
问题描述
我需要创建一个多面板图,其中 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 个需要斜体。
似乎在面板之间回收了矢量化face
参数。element_text()
我也尝试过axis.text.y = element_text(face = rep("italic", 3), c(rep("plain", 2)))
导致所有 5 个 y 轴标签都被斜体化。
如果可能的话,我不希望使用多个 ggplot 对象(即,grid_arrange()
或cowplot()
)。不过,我对任何允许我调整所有视觉格式元素的解决方案持开放态度。
我认为必须有一个使用的解决方案expression()
,但我一直无法解决。
解决方案
这是另一种选择。
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))
推荐阅读
- javascript - 控制 geojson 图层中的图层顺序(变量中的多个图层)
- r - 在包含通配符和转义符的字符串中查找模式
- matlab - 在傅里叶空间/去噪中分离两个(图像)信号
- c++ - 静态编译的纯标准 C++ 程序是否可移植提供在同一架构上运行?
- python - Django admin 中的 GenericForeignKey 内联
- javascript - 我是否使用了错误的 Ramda 函数,R.reduce 似乎没有工作
- python - 在 Docker 中安装 azure-storage
- java - 使用 Gitlab CI 和 Junit 测试媒体播放器
- javascript - 使用 jQuery 检查数据库的用户名
- embedded - 非对称固件加密