Динамическое форматирование меток отдельных осей в 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")`
Здесь есть похожая проблема, но решение включает в себя 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)
Но, если я пытаюсь сделать это путем индексации вместо того, чтобы печатать "Огурцы", я получаю следующую ошибку:
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 ответа
Как насчет
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")))