2015-08-10 2 views
3

Я проделал довольно много поисков и стараюсь сделать следующее. У меня есть бар-план с двумя уклоненными барами для каждого значения. Каждый бар представляет собой процент. (Примерно, как это выглядит, как я не могу добавлять изображения пока)Цвет, основанный на различии между полосками с использованием ggplot

Feature |XXXXXXXXXXXXXX %50 
     |XXXXXXXX  %25 

То, что я хотел бы сделать, это изменить цвет любого из баров «RED» всякий раз, когда разница в процентах составляет> 15

Вот данные я использую:

Feature variable   value 
A  "Percent Done" 50 
B  "Planned"   25 
A  "Percent Done" 10 
B  "Planned"   80 

Код:

p3 <- ggplot(plotdata, aes(x = Feature, y = value, fill = variable)) 
p3 <- p3 + geom_bar(position ="dodge", stat ="identity")+ 
     coord_flip() + theme_minimal() 

Так в основном, если мы смотрели на «макет» наверху. Поскольку проценты между 2 бара больше, чем на 15%, я хотел бы один из баров быть разного цвета (третий цвет), как показано ниже:

enter image description here

Я думал об использовании IfElse для установки цвета я просто не смог его реализовать. Мое мышление использует ifelse для возврата цвета, который я хочу использовать. Итак, «если» разница между двумя полосами составляет> 15, верните этот цвет «еще», чтобы вернуть другой цвет. Кто-нибудь знает возможно ли это?

+0

Что вы уже пробовали? И что вы хотите использовать для создания своего графика? Базовая графика R? Ggplot? Что-то другое? Можете ли вы опубликовать код для создания штрих-кода без красного цвета? – Heroka

+0

Можете ли вы предоставить некоторый воспроизводимый код? Один из вариантов - установить 'aes' следующим образом:' aes (fill = percent> 15) '. – drmariod

+0

@drmariod и 'dput' вашего кода. Было бы здорово. – SabDeM

ответ

2

Вы можете создать вектор цветов для заполнения перед вызовом ggplot.

## Sample data 
dat <- data.frame(`Percent Done`=c(25,10,15), 
        Planned=c(50,80,20), 
        Feature=factor(c("A","B","C"), levels=c("C","B","A"))) 
library(reshape2) 
dat <- melt(dat, id.vars = "Feature") # reshape the data to long format 

## Get the fill colors 
dat <- dat[order(dat$Feature, dat$variable, decreasing = T), ] 
dat$fills <- ifelse(c(0, abs(diff(dat$value))) > 15, "red", "yellow") 
dat$fills[c(T,F)] <- "black" 

ggplot(dat, aes(Feature, value, group=variable, order=rev(variable))) + 
    geom_histogram(stat="identity", aes(fill=fills), position=position_dodge()) + 
    scale_fill_manual(values=c("black","red","yellow"), labels=c("Plan",">15%", "Within 15%")) + 
    coord_flip() + 
    theme_bw() 

enter image description here Вы могли бы сделать это, используя скрытые переменные в вызове ggplot, а также, но это было бы сложнее.

+0

спасибо, это именно то, что я искал! – abemo

1

Мой ответ в том же духе, как @nongkrong:

set.seed(1) 
x<-data.frame(feat=letters[1:20],plan=runif(20),exec=runif(20)) # create some dummy data 
x$col<-((x$plan-x$exec)>=.15)+1 #create a color column 
library(reshape2) 
y<-melt(x,id.vars = c("feat","col")) # make it long 
y$col[which(y$variable=="plan")]<-0 # create a color difference between planed and executed 
y$col<-as.factor(y$col) # make it factor, so we can use it in ggplot 
ggplot(y,aes(feat,value,fill=col))+geom_bar(position=position_dodge(),stat="identity")+scale_fill_manual(values=c("black","green","red")) # Create a scale fill with the desired colors 
1

Использование dplyr/tidyr:

data.frame('Feature' = c('A', 'A', 'B', 'B'), 
      'variable' = c("PercentDone", "Planned", "PercentDone", "Planned"), 
      "value"=c(35,50,10,80)) %>% 
    spread(variable, value) %>% 
    mutate(colour=ifelse(Planned-PercentDone <= 15, "Within 15%", ">15%")) %>% 
    gather("variable", "value", 2:3) %>% 
    mutate(colour = ifelse(variable == "Planned", "Plan", colour)) %>% 
    ggplot(aes(x=Feature, y=value, fill=relevel(factor(colour), ref="Plan"))) + 
    geom_bar(stat="identity", position="dodge") 

enter image description here

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