在ggplot()中有选择地将字体样式应用于条带和图例标签

时间:2017-11-10 17:18:39

标签: r ggplot2

我有一个facet_wrap() - 直方图对,显示两个直方图。其中一个因子水平是物种二项式,应该用斜体字表示,但另一个因子水平应该是正常文本:

library(tidyverse)
set.seed(1234)
data1 <- tibble(species = c(rep("H. sapiens",100), rep("Other Species",100)),
            height = c(rnorm(100,174,25),rnorm(100,125,15)))
plt <- ggplot(data1) +
  geom_histogram(aes(x=height,fill=species),bins=10) +
  facet_wrap(~species,nrow = 2)

facet_wrap histogram

我尝试编写贴标机功能:

lbl <- function(variable, value) {
  if(variable == "H. sapiens") value= italics("H. sapiens") else value
}

并在调用facet_wrap时使用它:

facet_wrap(~species,nrow = 2, labeller = lbl)

但是这用数字1和2替换了上一个facet标签,并产生了警告:

  

警告:贴标机API已更新。标签制作者使用variable和    value参数现已弃用。请参阅贴标签文档。

如何仅将斜体应用于出现H. sapiens的条带,并且仅应用于图例中的相应标签?我意识到这是两个不同的问题,但它们都出现在这里。

我看到this post,但似乎有未解决的问题(这是一个更复杂的例子而且非常令人困惑)。有解决方案吗?

2 个答案:

答案 0 :(得分:1)

library(grid)
g <- ggplotGrob(plt)
g$grobs[[13]]$grobs[[1]]$children[[2]]$children[[1]]$gp$font <- 3L
attr(g$grobs[[13]]$grobs[[1]]$children[[2]]$children[[1]]$gp$font,"names") <- "italic"
grid.draw(g)

enter image description here

答案 1 :(得分:0)

您可以在数据中使用单独的“标签”列格式化为表达式,然后使用label_parse。

library(tidyverse)
library(stringr)
set.seed(1234)
data1 <- tibble(species = c(rep("H. sapiens",100), rep("Other Species",100)),
                height = c(rnorm(100,174,25),rnorm(100,125,15)))

data1$labels <- ifelse(data1$species == "H. sapiens",
                       str_replace(paste0("italic(", data1$species, ")"), " ", "~"),
                       str_replace(data1$species, " ", "~"))

plt <- ggplot(data1) +
  geom_histogram(aes(x=height,fill=species),bins=10) +
  facet_wrap(~labels,nrow = 2, labeller = label_parsed)
plt