Add legend to “geom_bar” using the ggplot2 package

前端 未结 2 455
别跟我提以往
别跟我提以往 2020-12-10 03:41

I am a newbie to R, so please pardon my ignorance. I made a pseudo-stacked barplot in which I drew 4 sets of bars on top of each other using geom_bar. There are 4 health sta

相关标签:
2条回答
  • 2020-12-10 04:13

    I see that @Brandon Bertelsen has posted a great answer. I would like to add some code that addresses additional details mentioned in the original post:

    1. After you reshape your data and map health status to fill, ggplot will create the legend automatically.
    2. I suggest using scale_fill_manual() to get the exact grays mentioned in the original post.
    3. theme_bw() is a handy function to quickly get a black and white look to your plot.
    4. The plotting order of factor levels/colors can be controlled by specifying the desired order with the levels argument of factor().
    5. A dodged barplot (instead of stacked) may have some advantages for this data set.

    library(reshape2)
    library(ggplot2)
    
    x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"), 
                            alive=c(627, 208, 109),  infected=c(102, 27, 0), 
                            dead=c(133, 112, 12), sod.dead=c(49, 8, 0)))
    
    # Put data into 'long form' with melt from the reshape2 package.
    dat = melt(x, id.var="variable", variable.name="status")
    
    head(dat)
    #    variable   status value
    # 1      QUAG    alive   627
    # 2      QUKE    alive   208
    # 3      QUCH    alive   109
    # 4      QUAG infected   102
    # 5      QUKE infected    27
    # 6      QUCH infected     0
    
    # By manually specifying the levels in the factor, you can control
    # the stacking order of the associated fill colors.
    dat$status = factor(as.character(dat$status), 
                        levels=c("sod.dead", "dead", "infected", "alive"))
    
    # Create a named character vector that relates factor levels to colors.
    grays = c(alive="gray85", dead="gray65", infected="gray38", sod.dead="black")
    
    plot_1 = ggplot(dat, aes(x=variable, y=value, fill=status)) +
             theme_bw() +
             geom_bar(position="stack") +
             scale_fill_manual(values=grays)
    
    ggsave(plot=plot_1, filename="plot_1.png", height=5, width=5)
    

    enter image description here

    # You may also want to try a dodged barplot.
    plot_2 = ggplot(dat, aes(x=variable, y=value, fill=status)) +
             theme_bw() +
             geom_bar(position="dodge") +
             scale_fill_manual(values=grays)
    
    ggsave(plot=plot_2, filename="plot_2.png", height=4, width=5)
    

    enter image description here

    0 讨论(0)
  • 2020-12-10 04:22

    You need to reshape your data.

    library(reshape)
    library(ggplot2)
    
    x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"), alive = c(627,208,109),  infected = c(102,27,0), dead = c(133,112,12), sod.dead=c(49,8,0)))
    
    x <- melt(x)
    colnames(x) <- c("Type","Status","value")
    
    ggplot(x, aes(Type, value, fill=Status)) + geom_bar(position="stack")
    
    0 讨论(0)
提交回复
热议问题