Выделение отдельных меток оси жирным шрифтом с помощью ggplot2
Я хочу выделить отдельные метки оси жирным шрифтом. Я знаю об этом ответ @MrFlick, но я не могу понять, как это сделать a) для более чем одного элемента, и b) можно ли использовать имена меток вместо номера элемента в списке (или выражение).
вот пример набора данных:
require(ggplot2)
require(dplyr)
set.seed(36)
xx<-data.frame(YEAR=rep(c("X","Y"), each=20),
CLONE=rep(c("A","B","C","D","E"), each=4, 2),
TREAT=rep(c("T1","T2","T3","C"), 10),
VALUE=sample(c(1:10), 40, replace=T))
затем я сортирую свои метки в соответствии с определенной комбинацией факторов, которая затем предполагается, что он будет поддерживаться на нескольких панелях участка. См. мой предыдущий вопрос здесь.
clone_order <- xx %>% subset(TREAT == "C" & YEAR == "X") %>%
arrange(-VALUE) %>% select(CLONE) %>% unlist()
xx <- xx %>% mutate(CLONE = factor(CLONE, levels = clone_order))
ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) +
geom_bar(stat="identity", position="dodge") +
facet_wrap(~TREAT)
теперь я хочу жирный Clone
A
, B
и E
. Я уверен, что это как-то сработает, но я не могу понять, как. В идеале, было бы здорово знать, как это сделать a) используя номер элемента в списке / выражении и b) С помощью метки, например A
, B
и E
.
3 ответов
вот общий метод для создания вектора ободрения:
colorado <- function(src, boulder) {
if (!is.factor(src)) src <- factor(src) # make sure it's a factor
src_levels <- levels(src) # retrieve the levels in their order
brave <- boulder %in% src_levels # make sure everything we want to make bold is actually in the factor levels
if (all(brave)) { # if so
b_pos <- purrr::map_int(boulder, ~which(.==src_levels)) # then find out where they are
b_vec <- rep("plain", length(src_levels)) # make'm all plain first
b_vec[b_pos] <- "bold" # make our targets bold
b_vec # return the new vector
} else {
stop("All elements of 'boulder' must be in src")
}
}
ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) +
geom_bar(stat="identity", position="dodge") +
facet_wrap(~TREAT) +
theme(axis.text.x=element_text(face=colorado(xx$CLONE, c("A", "B", "E"))))
Я не уверен, что вы можете сопоставить характеристики метки по имени, но это определенно можно сделать по позиции с вызовом theme
:
ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) +
geom_bar(stat="identity", position="dodge") +
facet_wrap(~TREAT) +
theme(axis.text.x = element_text(face = c('bold', 'bold', 'plain', 'plain', 'bold')))
обратите внимание, что перечисленные лица шрифта для axis.text.x
имеют ту же длину, что и метки вашей оси x (пять элементов). Это производит:
вы можете создать именованный вектор выражений (которые превращают текст в полужирный) в scale_x_discrete
и использовать parse=TRUE
для оценки выражений:
ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) +
geom_bar(stat="identity", position="dodge") +
facet_wrap(~TREAT) +
scale_x_discrete(labels=c("A"=expression(bold(A)), "C"=expression(bold(C)),
"E"=expression(bold(E)), parse=TRUE))
вы, вероятно, можете создать вектор выражений программно, а не печатать его, но способ сделать это ускользает от меня прямо сейчас.