2013-04-30 3 views
6

Я использую ggplot для построения участка пропорционального штабеля. И земля я получаю что-то вроде этого: enter image description hereR: ggplot лучше градиентный цвет

И это само написано функция Я использую:

df <- data.frame(id=letters[1:3],val0=1:3,val1=4:6,val2=7:9, val3=2:4, val4=1:3, val5=4:6, val6=10:12, val7=12:14) 

PropBarPlot<-function(df, mytitle=""){ 
    melteddf<-melt(df, id=names(df)[1], na.rm=T) 
    ggplot(melteddf, aes_string(x=names(df)[1], y="value", fill="variable")) + 
    geom_bar(position="fill") + 
    theme(axis.text.x = element_text(angle=90, vjust=1)) + 
    labs(title=mytitle) 
} 

print(PropBarPlot(df)) 

Здесь val4 и val5 не сильно отличаются.

Но из-за цветов некоторые из них не различимы. Может ли кто-нибудь сказать мне, как выбрать лучшие цвета, чтобы они были дифференцируемы?

Спасибо.

+0

Можете ли вы предоставить примерный кадр данных, чтобы упростить проверку графика? Во всяком случае, моя идея - взглянуть на scale_colour_brewer из ggplot, что позволяет использовать палитры из http://colorbrewer2.org – zelite

+0

@zelite Добавлено. Здесь в основном 'val4' и' val5' заметно не отличаются друг от друга. –

ответ

1

Спасибо @zelite и @ SimonO101 за вашу помощь. Это более простая версия того, что вы предложили. Добавление сюда для полноты.

library(ggplot2) 
library(reshape2) 
library(RColorBrewer) 

getColors<-function(n){ 
    mypal<-colorRampPalette(brewer.pal(12, "Paired")) 
    sample(mypal(n), n, replace=FALSE) 
} 

PropBarPlot<-function(df, mytitle=""){ 
    melteddf<-melt(df, id=names(df)[1], na.rm=T) 
    n<-length(levels(factor(melteddf$variable))) 

    ggplot(melteddf, aes_string(x=names(df)[1], y="value", fill="variable")) + 
     geom_bar(position="fill") + 
     scale_fill_manual(values=getColors(n)) + 
     theme(axis.text.x = element_text(angle=90, vjust=1)) + 
     labs(title=mytitle) 
} 

df <- data.frame(id=letters[1:3], 
      val0=1:3, 
      val1=4:6, 
      val2=7:9, 
      val3=2:4, 
      val4=1:3, 
      val5=4:6, 
      val6=10:12, 
      val7=12:14) 

print(PropBarPlot(df)) 

Спасибо.

14

Как насчет использования scale_fill_brewer, который использует цветовые палитры с сайта ColorBrewer, реализуемого пакетом RColorBrewer?

ggplot(diamonds, aes(clarity, fill=cut)) + 
geom_bar() + 
scale_fill_brewer(type = "div" , palette = "RdBu") 

enter image description here

Есть целый ряд различных расходящихся палитры вы можете выбрать.

require(RColorBrewer) 
?brewer.pal 

Если вам нужно больше цветов вы можете использовать colorRampPalette функции интерполировать между некоторыми цветами (и я хотел бы использовать brewer.pal палитру для этого). Вы можете сделать это следующим образом:

# Create a function to interpolate between some colours 
mypal <- colorRampPalette(brewer.pal(6 , "RdBu")) 
# Run function asking for 19 colours 
mypal(19) 
[1] "#B2182B" "#C2373A" "#D35749" "#E47658" "#F0936D" "#F4A989" "#F8BFA5" 
[8] "#FCD6C1" "#F3DDD0" "#E7E0DB" "#DAE2E6" "#CBE1EE" "#ADD1E5" "#90C0DB" 
[15] "#72AFD2" "#5B9DC9" "#478BBF" "#3478B5" "#2166AC" 

В вашем примере, который требует 8 цветов вам использовать его, как это с scale_fill_manual():

PropBarPlot<-function(df, mytitle=""){ 
    melteddf<-melt(df, id=names(df)[1], na.rm=T) 
    ggplot(melteddf, aes_string(x=names(df)[1], y="value", fill="variable")) + 
    geom_bar(position="fill") + 
    theme(axis.text.x = element_text(angle=90, vjust=1)) + 
    labs(title=mytitle)+ 
    scale_fill_manual(values = mypal(8)) 
} 

print(PropBarPlot(df)) 
+0

Я проверил разные палитры, лучшее, что я получаю, - это максимум 12 вариантов, тогда как в моем случае мне нужно как минимум 19 цветов. Со всеми палитрами возникает проблема. –

+0

@RachitAgrawal хорошо, я обновился до того, что может сработать для вас. Проверьте изменение. –

+0

Страдает от той же проблемы, упомянутой выше. Некоторые из них нельзя отличить. –

1

Заимствование код от @ SimonO101

library(ggplot2) 
library(reshape2) 
library(RColorBrewer) 
mypal <- colorRampPalette(brewer.pal(9 , "Set1")) #you can try using different palete instead 
#of "Set1" until it looks good to you 

intercalate <- function(n){ #my crude attempt to shuffle the colors 
    c(rbind(1:(n/2), n:(n/2+1))) #it will only work for even numbers 
} 

PropBarPlot<-function(df, mytitle=""){ 
    melteddf<-melt(df, id=names(df)[1], na.rm=T) 
    ggplot(melteddf, aes_string(x=names(df)[1], y="value", fill="variable")) + 
    geom_bar(position="fill") + 
    theme(axis.text.x = element_text(angle=90, vjust=1)) + 
    labs(title=mytitle)+ 
    scale_fill_manual(values = mypal(8)[intercalate(8)]) 
    #better would be to calculate the different number of categories 
    #you have and put that instead of the number 8 
} 

df <- data.frame(id=letters[1:3], 
       val0=1:3, 
       val1=4:6, 
       val2=7:9, 
       val3=2:4, 
       val4=1:3, 
       val5=4:6, 
       val6=10:12, 
       val7=12:14) 

print(PropBarPlot(df)) 

Посмотрите, работает ли это лучше для ваших нужд.

+0

Я придумал более простое решение для смешивания цветов. Добавлено ниже. Спасибо за помощь. –

0

Я хотел бы использовать scale_fill_manual = C («красный», «зеленый»), вы можете поместить больше цветов, если вы хотите или scale_fill_brewer (палитра = «красные»), мне нравится это. Вы можете использовать палитры здесь

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