在 ggplot2 中动态格式化单个轴标签

Dynamically formatting individual axis labels in ggplot2

这可能最终成为一个 expressioncall 问题,但我正在尝试有条件地格式化各个轴标签。

在下面的示例中,我想有选择地加粗其中一个轴标签:

library(ggplot2)

data <- data.frame(labs = c("Oranges", "Apples", "Cucumbers"), counts = c(5, 10, 12))

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity")`

也有类似的问题here,但解决方案涉及themeelement_text。我正在尝试直接使用轴标签。

我可以手动执行此操作,如下所示:

breaks <- levels(data$labs)
labels <- breaks
labels[2] <- expression(bold("Cucumbers"))

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity") + 
  scale_x_discrete(label = labels, breaks = breaks)

但是,如果我尝试通过索引而不是键入 "Cucumbers" 来完成此操作,我会收到以下错误:

breaks <- levels(data$labs)
labels <- breaks
labels[2] <- expression(bold(labels[2]))

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity") + 
  scale_x_discrete(label = labels, breaks = breaks)

这是有道理的,因为它没有评估 labels[2]。但是,有谁知道如何强制它这样做?谢谢。

怎么样

breaks <- levels(data$labs)
labels <- as.expression(breaks)
labels[[2]] <- bquote(bold(.(labels[[2]])))

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity") + 
  scale_x_discrete(label = labels, breaks = breaks)

这里我们更明确地转换为表达式,我们使用 bquote() 将标签的值插入表达式本身。

另一种选择是使用 theme 动态设置字体,但我不确定这在任何意义上是否比@MrFlick 的回答更好或更差:

breaks <- levels(data$labs)

# Reference breaks by name
toBold = "Cucumbers"

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity") + 
  scale_x_discrete(label = labels, breaks = breaks) +
  theme(axis.text.x=
        element_text(face=ifelse(breaks %in% toBold, "bold", "plain")))

# Reference breaks by position
label.index=2

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity") + 
  scale_x_discrete(label = labels, breaks = breaks) +
  theme(axis.text.x=
        element_text(face=ifelse(breaks %in% labels[match(label.index, 1:length(breaks))], 
                                 "bold", "plain")))