Barplot使用ggplot

时间:2014-03-05 18:02:02

标签: r bar-chart

我有一个像

这样的数据框
  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到0) 5)

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

1 个答案:

答案 0 :(得分: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()