2016-08-30 1 views
5

Я хочу изменить порядок штрихового графика только для последнего набора, просто выделив его. Я использовал scale_fill_manual(), но это не помогло.Измените цвет заливки одного из уклоняемых баров в ggplot

Вот мой код:

x<-c(rep(c("Type1", "Type2"),4)) 
    y<-c(4,5,6,7,3,4,5,2) 
    time<-c(2010,2010,2011,2011,2012,2012,2013,2013) 
    z<-data.frame(type = x, val=y, Time = time) 

    ggplot(data = z, aes(x=Time,y=val)) + 
     geom_bar(stat = "identity", position = "dodge", aes(fill=type))+ 
     scale_fill_manual(values = c(rep(c("white", "gray51"),3),"white","red")) 

Вот результат:

enter image description here

Я хочу график выглядеть следующим образом: enter image description here

Есть ли способ, что я могу сделать это ? Буду признателен за любую помощь. Я посмотрел change color of only one bar in ggplot, но, похоже, это не сгруппированные данные.

+0

Вы в особенности о легенде, не имеющей красного? Это было бы сложной частью этого ... – Gregor

+0

@gregor Я думаю, будет лучше, если у легенды нет красного цвета. Тем не менее, я новичок в R и 'ggplot2'. Итак, я был бы признателен, если бы вы могли направить меня, как мы можем это сделать без и с легендой. Большое спасибо за Вашу помощь. Я очень ценю это. – watchtower

+0

См. Правки в конце моего ответа, чтобы сохранить красный из легенды. – Gregor

ответ

7

Моя общая мантра такова, что ggplot очень хорош при построении данных, которые вы ему даете. Если вы хотите, чтобы в нем было что-то другое, проще всего изменить ваши данные.

z$type2 = as.character(z$type) 
z$type2[z$type == "Type2" & z$Time == 2013] = "Type2 " 

Я добавил подлый дополнительное пространство в "Type2 " для строки вы хотите выделить. Это будет особый факторный уровень и получить свой собственный цвет (и даже быть принужденным к хорошему порядку с использованием алфавитного значения по умолчанию). Но это будет похоже на ярлык легенды.

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", aes(fill=type2))+ 
    scale_fill_manual(values = c("white", "gray50", "red")) 

enter image description here

Я думал, что опуская красный из легенды будет трудно, но this answer показал мне, что все, что нужно, это добавить breaks = c("Type1", "Type2") в качестве аргумента scale_fill_manual.

6

Как насчет подсветки бара с рамкой. Например:

z$hi = with(z, ifelse(type=="Type2" & Time==2013, "Y","N")) 

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", 
      aes(fill=type, colour=hi), size=1) + 
    scale_fill_manual(values=c("gray51","white")) + 
    scale_colour_manual(values=c(NA,"red")) + 
    guides(colour=FALSE) 

enter image description here

UPDATE: В ответ на ваш комментарий: Я думаю, что линия сюжета делает его легче увидеть тенденции и взаимосвязи между каждым type. Например:

ggplot(data = z, aes(x=Time,y=val,colour=type)) + 
    geom_line() + 
    geom_point() + 
    geom_point(data=z[z$hi=="Y",], aes(x=Time, y=val), size=4, pch=1, 
      colour=hcl(195,100,40), stroke=1) + 
    scale_y_continuous(limits=c(0,max(z$val))) + 
    theme_bw() 

enter image description here

+0

Очень хорошая идея! – Gregor

+0

Спасибо..Грегор! – eipi10

+0

Цвет внутри звонка значительно лучше, чем у моего двухэтапного решения ниже. –

1

Легко сделать это с легендой, хотя вы можете быть осторожными отключал пользователей с резким изменением цвета. Просто добавьте дополнительную категорию в свою переменную x, чтобы указать, где вы хотите выделить.

x<- xHigh <- c(rep(c("Type1", "Type2"),4)) 
xHigh[length(xHigh)] <- "Type2_highlight" 

myHighlight <- rep("No",length(x)) 
myHighlight[length(myHighlight)] <- "Yes" 
y<-c(4,5,6,7,3,4,5,2) 
time<-c(2010,2010,2011,2011,2012,2012,2013,2013) 
z<-data.frame(type = x, xHigh = xHigh, val=y, Time = time, myHighlight = myHighlight) 

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", aes(fill=xHigh))+ 
    scale_fill_manual(values = c(Type1 = "white", Type2 = "gray51", Type2_highlight = "red")) 

enter image description here

Другой возможный вариант для выделения конкретного бара, чтобы нарисовать прямоугольник вокруг него, например, так:

ggplot(data = z, aes(x=Time,y=val)) + 
    geom_bar(stat = "identity", position = "dodge", aes(fill=type))+ 
    scale_fill_manual(values = c(Type1 = "white", Type2 = "gray51")) + 
    geom_bar(aes(linetype = xHigh) 
      , fill = NA 
      , stat = "identity", position = "dodge" 
      , col = "red" 
      , show.legend = FALSE) + 
    scale_linetype_manual(values = c(Type1 = 0 
            , Type2 = 0 
            , Type2_highlight = 1)) 

enter image description here

Надежда, что помогает.

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