14

我正在尝试获得一个相当常见的条形图,但是尽管阅读了大量关于在 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

我想要得到的是一个带有Blockx 轴列的条形图,用作分类变量。在 y 轴上,我想要绘制RTregRTrnd列的值。这是我无法正确处理的部分。我想要的是在 x 轴上每个刻度线有两个条。一根代表该RTreg块中的值,一根代表该RTrnd块中的值。像这样的东西:

有效的 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我,但我打算并排获得两个酒吧。但是,我得到的情节是:

有效的 XHTML .

关于如何将两个条并排放置的任何想法,并希望每个条都有不同的颜色和图例?我真的很感激这里的一些指导。

提前致谢。

4

2 回答 2

32

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

假设数据框名为df.

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

在此处输入图像描述

于 2013-03-01T12:55:50.587 回答
2

使用原生 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()ie '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()m的 'nrow' 参数后将它们复制到矩阵的行中。现在,为了实现上述结构,我简单地创建了一个空矩阵,并分别在第 1 行和第 2 行复制了“RTreg”和“RTrnd”。创建矩阵后,您就可以开始了。只需将该barplot()函数与您的矩阵一起作为高度参数调用,并且不要忘记将 'beside' 参数设置为TRUE

上述代码的结果:

在此处输入图像描述

于 2019-06-22T14:19:31.233 回答