Search code examples
rggplot2geom-bar

reorder barchart as bell curve (density) in R


Lets say I have a data frame :

df <- data.frame(x = c("A","B","C"), y = c(10,20,30)) 

and I wish to plot it with ggplot2 such that I get a plot like a histogram ( where instead of plotting count I plot my y column values from the data frame. ( I don't mind if the x column is a factor column or a character column.

I will add that I know how to reorder a bar chart by descending/ascending, but ordering like a histogram (highest values in the middle- around the mean and decreasing to both sides) is still beyond me.

I thought of transmuting the data such that I can fit it in a histogram - like creating a vector with 10 "A"objects, 20 "B" and 30 "C" and then running a histogram on that. But its not practical for what I'm trying to do as it seems like a lazy and highly inefficient way to do it. Also the df data frame is huge as it is- so multiplying by millions etc is not going to be kind on my system.


Solution

  • This seems like a strange thing to want to do, since if the ordering is not already implicit in your x variables, then ordering as a bell curve is at best artificial. However, it's fairly trivial to implement if you really want to...

    library(ggplot2)
    
    df <- data.frame(yvals = floor(abs(rnorm(26)) * 100),
                     xvals = LETTERS,
                     stringsAsFactors = FALSE)
    
    ggplot(data = df, aes(x = xvals, y = yvals)) + geom_bar(stat = "identity")
    

    enter image description here

    ordered    <- order(df$yvals)
    left_half  <- ordered[seq(1, length(ordered), 2)]
    right_half <- rev(ordered[seq(2, length(ordered), 2)])
    new_order  <- c(left_half, right_half)
    df2        <- df[new_order,]
    df2$xvals  <- factor(df2$xvals, levels = df2$xvals)
    
    ggplot(data = df2, aes(x = xvals, y = yvals)) + geom_bar(stat = "identity")
    

    enter image description here