2014-06-06 3 views
10

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

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

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

Результат будет что-то вроде

enter image description here

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

+0

Я не согласен с последним предложением. Если вы хотите выделить «выбросы», покрасьте очки. Что касается вопроса: Да, это возможно. Однако, нелегко, потому что ggplot2 не был предназначен для этого. Таким образом, вам, вероятно, придется создать гроб и взломать его. – Roland

+0

На самом деле эта функция была запрошена нашим графическим дизайнером. Фактический граф намного плотнее этого простого примера, с длинными метками на оси. Мы используем модификацию цвета, чтобы слегка осветлить имена точек, не входящих в систему. Игнорируемые имена попадают в глаза, что является самой целью графика. Это довольно эффективно для общения, действительно;) – user2147028

+0

Возможный дубликат [этого вопроса] (http://stackoverflow.com/questions/20609716/changing-format-of-some-axis-labels-in-ggplot2-according-to- условие) –

ответ

17

Более простой способ (ИМО), чтобы сделать это просто создать условный цвет вектор и разобрать его в 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

+0

Отличное спасибо! Немного лишнее, если график построен с помощью 'facet_grid (..., scale =" free_y "). Этот метод больше не применяется, поскольку вектор цвета перерабатывается через грани. идея для этого случая? – user2147028

+0

Это может быть новый вопрос, который я предполагаю –

4

Я не думаю, что это так хорошо, как окрашивать саму точку останец, но вы можете поредактируете на Grob:

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] предполагая, что порядок строк необходим. Однако я могу только повторить, что вы, вероятно, должны создать другой график, если считаете, что вам нужно что-то вроде этого.

+0

Спасибо, это определенно путь. Я буду работать, чтобы выяснить, как автоматизировать локализацию grob. Я еще не очень хорошо разбираюсь в структуре gtable. – user2147028

+1

Для безусловного сюжета вы можете просто выполнить ggplot (dat) + geom_point (data = dat, aes (x = value, y = name)) + theme (axis.text.y = element_text (color = c ("grey50 "," red "," grey50 ")))' –

Смежные вопросы