在 ggplot2 中动态格式化单个轴标签
Dynamically formatting individual axis labels in ggplot2
这可能最终成为一个 expression
或 call
问题,但我正在尝试有条件地格式化各个轴标签。
在下面的示例中,我想有选择地加粗其中一个轴标签:
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,但解决方案涉及theme
和element_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")))
这可能最终成为一个 expression
或 call
问题,但我正在尝试有条件地格式化各个轴标签。
在下面的示例中,我想有选择地加粗其中一个轴标签:
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,但解决方案涉及theme
和element_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")))