plotting grouped bar charts in R

前端 未结 3 856
忘掉有多难
忘掉有多难 2020-12-08 17:48

i am trying to plot this data in R -

column1  column2  column3
1-2       abc       10
1-2       def       15
1-2       ghi       20
2-3       abc       80
2-         


        
相关标签:
3条回答
  • 2020-12-08 18:13

    Your problem seem to come down to wrong data formatting. You need to make a matrix with the right row names structure to create plot that you want with base graphics. Here is your solution:

    #your data...
    d <- data.frame(row.names=c("1-2","2-3","3-4"), abc = c(10,80, 30), 
                    def = c(15, 95, 55), ghi = c(20, 10, 80))
    #but you make a matrix out of it to create bar chart
    d <- do.call(rbind, d)
    #...and you are sorted
    barplot(d, beside = TRUE, ylim=c(0,100), legend.text = rownames(d), 
            args.legend = list(x = "topleft", bty="n"))
    

    enter image description here

    However, I sometimes like to use lattice for this kind of task. This time you don't even have to make matrix, you just keep your data.frame in original format:

    d <- data.frame(column1=rep(c("1-2","2-3","3-4"), each=3), 
                    column2=rep(c("abc", "def", "ghi"), 3), 
                    column3=c(10, 15, 20, 80, 95, 10, 30, 55, 80))
    require(lattice)
    barchart(column3 ~ column1, groups=column2, d, auto.key = list(columns = 3))
    

    enter image description here

    0 讨论(0)
  • 2020-12-08 18:19

    I like to use ggplot2 for this kind of task.

    #Make the data reproducible:
    column1 <- c(rep("1-2", 3), rep("2-3", 3), rep("3-4", 3))
    column2 <- gl(3, 1, 9, labels=c("abc", "def", "ghi"))
    column3 <- c(10, 15, 20, 80, 95, 10, 30, 55, 80)
    
    d <- data.frame(column1=column1, column2=column2, column3=column3)
    
    require(ggplot2)
    ggplot(d, aes(x=column1, y=column3, fill=column2)) + geom_bar(position=position_dodge())
    

    The reason I find this intuitive (after a bit of a learning period) is that you clearly stated what you want on the x and y axes, and we simply tell ggplot that (as well as which variable defines the 'fill' color, and which kind of plot - here, geom_bar - to use.

    enter image description here

    0 讨论(0)
  • 2020-12-08 18:25

    I found help from Drew Steen's answer, but this code above did not work for me as show above. I added stat="identity" and it works.

    require(ggplot2)
    ggplot(d, aes(x=column1, y=column3, fill=column2)) + geom_bar(stat="identity", position=position_dodge())
    

    Thank you Drew for your answer.

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