Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Coloring a geom_histogram by gradient

I'm trying to plot a geom_histogram where the bars are colored by a gradient.

This is what I'm trying to do:

library(ggplot2)
set.seed(1)
df <- data.frame(id=paste("ID",1:1000,sep="."),val=rnorm(1000),stringsAsFactors=F)
ggplot(df,aes_string(x="val",y="..count..+1",fill="val"))+geom_histogram(binwidth=1,pad=TRUE)+scale_y_log10()+scale_fill_gradient2("val",low="darkblue",high="darkred")

But getting: enter image description here

Any idea how to get it colored by the defined gradient?

like image 600
dan Avatar asked May 05 '17 01:05

dan


2 Answers

Not sure you can fill by val because each bar of the histogram represents a collection of points.

You can, however, fill by categorical bins using cut. For example:

ggplot(df, aes(val, fill = cut(val, 100))) +
  geom_histogram(show.legend = FALSE)

histogram

like image 125
Simon Jackson Avatar answered Sep 26 '22 20:09

Simon Jackson


Just for completeness.

If the colors I'd like to have the gradient on to be manually selected here's what I suggest:

data:

library(ggplot2)
set.seed(1)
df <- data.frame(id=paste("ID",1:1000,sep="."),val=rnorm(1000),stringsAsFactors=F)

colors:

bins <- 10
cols <- c("darkblue","darkred")
colGradient <- colorRampPalette(cols)
cut.cols <- colGradient(bins)
cuts <- cut(df$val,bins)
names(cuts) <- sapply(cuts,function(t) cut.cols[which(as.character(t) == levels(cuts))])

plot:

ggplot(df,aes(val,fill=cut(val,bins))) + 
    geom_histogram(show.legend=FALSE) +
    scale_color_manual(values=cut.cols,labels=levels(cuts)) +
    scale_fill_manual(values=cut.cols,labels=levels(cuts))

enter image description here

like image 20
dan Avatar answered Sep 22 '22 20:09

dan