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

11

这可能最终成为一个表达式或调用问题,但我正在尝试有条件地格式化单个轴标签。

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

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]。但是,是否有人知道如何强制它执行评估?谢谢。

2个回答

12

怎么样?

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()将标签的值插入表达式中。


是的!bquote.( )正是我所需要的。谢谢。这个函数名有没有什么助记符?反引号? - Sealander
从帮助页面来看,“这是 LISP 反引号宏的类比”,所以它非常接近。 - MrFlick
@MrFlick 我怎样才能对多个项目进行这样的操作?例如对于位置2和3?而且我可以通过指定因子名称来实现吗,比如"黄瓜"和"橙子"吗?谢谢! - Stefan
@Stefan 你可能需要提出一个新问题,并提供一个可重现的例子,说明你的情况有何不同。labels基本上像一个列表一样询问,因此您可以使用任何用于迭代列表的函数。标签的顺序按照断点的顺序进行,因此您可以在其中一个中查找值并在另一个中进行索引而不会出现问题。 - MrFlick

2

另一种选择是使用主题动态设置字体,虽然我不确定这是否比@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")))

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