Динамическое форматирование меток отдельных осей в 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")))
Другие вопросы по тегам