首页 文章

Barplot使用ggplot

提问于
浏览
1

我有一个数据框

Model1    Model2      Model3    Model4
      4          4          5         5
      4          4         NA        NA
      3          2          5         5
      2          2          3         3
      3          3          3         3
      3          3          4         4

我想画一个像这样的条形图

enter image description here

x轴将具有Model1,Model2,Model3和Model4,并且条形将是每列中的分数的比例,即,每个模型的6个条(在完整数据中,我具有从0到5的分数)

如何在不使用rbind创建数据框或创建矩阵的情况下完成此操作?任何帮助将不胜感激 .

1 回答

  • 2

    如果不改变数据格式,就无法做到,但这并不困难 .

    您可以使用reshape2包的熔化选项 .

    我创建了数据的数据框:

    df1<-data.frame("Model1"=c(4,4,3,2,3,3),
                       "Model2"=c(4,4,2,2,3,3),
                       "Model3"=c(5,NA,5,3,3,4),
                       "Model4"=c(5,NA,5,3,3,4))
    
      Model1 Model2 Model3 Model4
    1      4      4      5      5
    2      4      4     NA     NA
    3      3      2      5      5
    4      2      2      3      3
    5      3      3      3      3
    6      3      3      4      4
    

    接下来,您可以使用reshape2包重新整形数据:

    library(reshape2)
    df2<-melt(df1)
    
        variable value
    1     Model1     4
    2     Model1     4
    3     Model1     3
    4     Model1     2
    5     Model1     3
    6     Model1     3
    7     Model2     4
    8     Model2     4
    9     Model2     2
    10    Model2     2
    11    Model2     3
    12    Model2     3
    13    Model3     5
    14    Model3    NA
    15    Model3     5
    16    Model3     3
    17    Model3     3
    18    Model3     4
    19    Model4     5
    20    Model4    NA
    21    Model4     5
    22    Model4     3
    23    Model4     3
    24    Model4     4
    

    重命名列以方便:

    names(df2)<-c("Model","Score")
    

    然后计算比例:

    df3 <- as.data.frame(table(df2))
    df3$prop<-df4$Freq/4*100
    

    最后,情节:

    ggplot(df3,aes(x=Model,y=prop,fill=as.factor(Score)))+
           geom_bar(stat="identity",position="dodge")+
           xlab("Models")+
           ylab("Prop. of Cases (%)")+
           ggtitle("Sample Data")+
           guides(fill=guide_legend(title="Scores"))+
           scale_fill_manual(values = c("2" = "lightblue", "3" = "mistyrose","4"="lightcyan","5"="lavender"))+
           theme_bw()
    

相关问题