How to fill histogram with color gradient?

前端 未结 2 821
不思量自难忘°
不思量自难忘° 2020-12-11 07:48

I have a simple problem. How to plot histogram with ggplot2 with fixed binwidth and filled with rainbow colors (or any other palette)?

Let

相关标签:
2条回答
  • 2020-12-11 08:42

    In case the binwidth is fixed, here is an alternative solution which is using the internal function ggplot2:::bin_breaks_width() to get the number of bins before creating the graph. It's still a workaround but avoids to call geom_histogram() twice as in the other solution:

    # create sample data
    set.seed(1L)
    myData <- abs(rnorm(1000))
    binwidth <- 0.1
    
    # create plot    
    library(ggplot2)   # CRAN version 2.2.1 used
    n_bins <- length(ggplot2:::bin_breaks_width(range(myData), width = binwidth)$breaks) - 1L
    ggplot() + geom_histogram(aes(x = myData), binwidth = binwidth, fill = rainbow(n_bins)) 
    


    As a third alternative, the aggregation can be done outside of ggplot2. Then, geom_col() cam be used instead of geom_histogram():

    # start binning on multiple of binwidth
    start_bin <- binwidth * floor(min(myData) / binwidth)
    # compute breaks and bin the data
    breaks <- seq(start_bin, max(myData) + binwidth, by = binwidth)
    myData2 <- cut(sort(myData), breaks = breaks, by = binwidth)
    
    ggplot() + geom_col(aes(x = head(breaks, -1L), 
                            y = as.integer(table(myData2)), 
                            fill = levels(myData2))) + 
      ylab("count") + xlab("myData")
    

    Note that breaks is plotted on the x-axis instead of levels(myData2) to keep the x-axis continuous. Otherwise each factor label would be plotted which would clutter the x-axis. Also note that the built-in ggplot2 color palette is used instead of rainbow().

    0 讨论(0)
  • 2020-12-11 08:49

    If you really want the number of bins flexible, here is my little workaround:

    library(ggplot2)
    
    gg_b <- ggplot_build(
      ggplot() + geom_histogram(aes(x = myData), binwidth=.1)
    )
    
    nu_bins <- dim(gg_b$data[[1]])[1]
    
    ggplot() + geom_histogram(aes(x = myData), binwidth=.1, fill = rainbow(nu_bins))
    

    0 讨论(0)
提交回复
热议问题