Как получить метки тиков оси с разными цветами в пределах одной оси для графика ggplot?

Рассмотрим простой граф ggplot2

library(ggplot2) 
dat <- data.frame(name=c("apple", "orange", "plum"),value=c(3,8,2),outlier=c(FALSE,TRUE,FALSE))
ggplot(dat)+geom_point(aes(x=value,y=name))

enter image description here

Есть ли способ модифицировать атрибуты стилей оси y метки (например, цвет) условно, например, в зависимости от столбца outlier в dat?

В результате получилось бы что-то вроде

enter image description here

На графике с большим количеством элементов эта функция wold значительно улучшает читаемость и влияние графика.

Ответ 1

Более простой способ (IMO) сделать это - просто создать условный вектор цвета и проанализировать его на axis.text.y

dat <- data.frame(name=c("apple", "orange", "plum"),value=c(3,8,2),outlier=c(FALSE,TRUE,FALSE))
colvec <- character(dim(dat)[1])
colvec <- ifelse(dat$outlier, "red", "black")

library(ggplot2) 
ggplot(dat) +
geom_point(data = dat, aes(x=value,y=name)) +
theme(axis.text.y = element_text(colour=colvec))

enter image description here

Ответ 2

Я не думаю, что это так же хорошо, как окраска самой точки выброса, но вы можете взломать гроб:

p <- ggplot(dat)+geom_point(aes(x=value,y=name))
g <- ggplotGrob(p)

#I found this by using str(g) and looking for "axis.text.y.text"
#there is probably a clever way of automating this
g[[1]][[2]]$children$axis$grobs[[1]]$gp$col <- c("grey50", "red", "grey50")

plot(g)

enter image description here

Выполнение этого условно возможно, используя что-то вроде c("grey50", "red")[dat$outlier], предполагая, что порядок строк необходим. Однако я могу только повторить, что вы, вероятно, должны создать другой график, если вы считаете, что вам нужно что-то вроде этого.