我试图获得一个相当常见的条形图,但尽管阅读了大量有关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轴上,我想要绘制RTreg
和RTrnd
列的值。这是我无法做到的部分。我想要的是在x轴上每个刻度标记有两个条。一个条表示该块中RTreg
的值,一个条表示该块中RTrnd
的值。像这样:
但是有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
关于如何并排获得两个酒吧的想法,并希望每种酒都有不同的颜色和图例?我真的很感激这里的一些指导。
提前致谢。
答案 0 :(得分:23)
您必须将数据框从宽到长整形,然后您不需要分别为每个条件设置条形。
假设数据框名为df
。
library(reshape2)
df.long<-melt(df)
ggplot(df.long,aes(Block,value,fill=variable))+
geom_bar(stat="identity",position="dodge")
答案 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 。
以上代码的结果: