R: best ggplot gradient color

I use ggplot to plot the proportional stroke line. And the Plot that I get looks something like this: enter image description here

And this is the self-recording function that I use:

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)) 

Here val4 and val5 not much different.

But because of the colors, some of them are not distinguishable. Can someone tell me how to choose the best colors so that they are differentiable?

Thanks.

+6
source share
4 answers

Thanks @zelite and @ SimonO101 for your help. This is a simpler version of what you suggested. Adding here for completeness.

 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)) 

Thanks.

+1
source

How about using scale_fill_brewer , which uses color palettes from the ColorBrewer website, which is implemented by RColorBrewer ?

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

enter image description here

There are several different diverging palettes you can choose.

 require(RColorBrewer) ?brewer.pal 

If you need more colors, you can use the colorRampPalette functions to interpolate between some colors (and I would use the brewer.pal palette for this). You can do it like this:

 # 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" 

In your example, which requires 8 colors, you use it like this: 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)) 
+14
source

Borrowing some code from @ 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)) 

See if this works best for your needs.

+1
source

I would use scale_fill_manual = c ("red", "green"), you can add more colors if you want or scale_fill_brewer (palette = "Reds"), I like it. Here you can use palettes.

0
source

Source: https://habr.com/ru/post/943945/


All Articles