Barplot与2个变量并排

时间:2013-03-01 12:50:46

标签: r plot ggplot2

我试图获得一个相当常见的条形图,但尽管阅读了大量有关R中绘图的文档,以及ggplot及其所有图层的文档,但我无法按照我想要的方式获取此图。

我的数据非常简单。

aov.data
   Block    RTreg    RTrnd
1 Block1   0.0000 862.0707 
2 Block2 667.2081 770.4315 
3 Block3 645.4730 696.0200
4 Block4 674.5200 659.4765
5 Block5 651.4295 633.7333

我想得到的是一个在x轴上带有Block列的条形图,作为分类变量。在y轴上,我想要绘制RTregRTrnd列的值。这是我无法做到的部分。我想要的是在x轴上每个刻度标记有两个条。一个条表示该块中RTreg的值,一个条表示该块中RTrnd的值。像这样:

Valid XHTML

但是有5组两个而不是两个。

到目前为止,我使用了以下代码:

ggplot(aov.data,aes(x=Block)) + 
          geom_bar(aes(y=RTreg),stat="identity",position="dodge",col="blue") +
          geom_bar(position="dodge") +   
          geom_bar(aes(y=RTrnd),stat="identity",position="dodge",col="red")

我以为我要做的是先用包含块的分类x轴创建基础图。然后,使用geom_bar我认为我正在添加RTreg列,第二个geom_bar,我正在添加RTrnd列。选项position等于dodge我虽然可以并排获得两个酒吧。但是,我得到的情节是:

Valid XHTML http://s12.postimage.org/k0przrmtp/failed_geom_bar.png

关于如何并排获得两个酒吧的想法,并希望每种酒都有不同的颜色和图例?我真的很感激这里的一些指导。

提前致谢。

2 个答案:

答案 0 :(得分:23)

您必须将数据框从宽到长整形,然后您不需要分别为每个条件设置条形。

假设数据框名为df

library(reshape2)
df.long<-melt(df)
ggplot(df.long,aes(Block,value,fill=variable))+
     geom_bar(stat="identity",position="dodge")

enter image description here

答案 1 :(得分:0)

使用本机R函数的另一种方法:

#Taking the Dataset mentioned in the question
df = data.frame(Block = c("Block 1", "Block 2", "Block 3", "Block 4", "Block 5"), RTreg = c(0.0,667.208,645.47,674.52,651.42), RTrnd = c(862.07,770.43,696.02,659.476,633.733))

#Create a Matrix which will help in creating the plot
value_matrix = matrix(, nrow = 2, ncol = 5)
#An empty matrix is a necessary requirement prior to copying data
value_matrix[1,] = df$RTreg 
value_matrix[2,] = df$RTrnd

#Note that the "beside" argument has to be kept "TRUE" in order to place the bars side by side
barplot(value_matrix, names.arg = df$Block, beside = TRUE, col = c("peachpuff", "skyblue"), legend.text = c("RTreg", "RTrnd"))

上面发生了什么?

要回答这个问题,我首先想请您注意barplot()的第一个参数,即'height'。现在,在这里,如果您提供矢量作为输入,则该函数将生成一个常规的条形图,就像您期望的那样。但是,为了绘制群集的条形图,您必须以矩阵格式提供数据。现在,魔术来了。对于聚集的条形图,您的变量需要出现在矩阵的行中,而不是规则的列中。我的意思是说,而不是沿着列存储数据:

   RTreg     RTrnd
1  0.0000    862.0707 
2  667.2081  770.4315 
3  645.4730  696.0200

跨行存储数据:

       1        2        3
RTreg  0.0000   667.2081 645.4730
RTrnd  862.0707 770.4315 696.0200

这是barplot()识别2个不同变量“ RTreg”和“ RTrnd”的方式。如果您希望将 m 个其他变量放入群集中,则在将matrix()的'nrow'参数设置为后,只需将它们复制到矩阵的行中即可m 。现在,要实现上述结构,我只需创建一个空矩阵,然后分别在第1行和第2行中复制“ RTreg”和“ RTrnd”即可。创建矩阵后,就可以使用了。只需将barplot()函数与矩阵一起调用为height参数,别忘了将'sideside'参数设置为 TRUE

以上代码的结果:

enter image description here