【问题标题】:Barplot with 2 variables side by side并排有 2 个变量的条形图
【发布时间】:2013-02-15 23:36:21
【问题描述】:

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

.

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

.

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

提前致谢。

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

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

    假设数据框名为df

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

    【讨论】:

    • 是的,欢迎来到 ggplot...很难区分简单和不可能!
    • 我在哪里指定应该采用哪些 y 值?例如。我有超过 2 列(RTreg、RTrnd)
    • 附注您将如何以对角线而不是水平线显示字幕?
    • 如何将 geom_text(aes(x=, y=, label=mylabels) 选项与闪避条一起使用,以使标签居中在每个条上?
    【解决方案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() 的第一个参数,即“身高”。现在,如果您提供一个向量作为输入,那么该函数将生成一个常规条形图,就像您期望的那样。但是,为了绘制聚集条形图,您必须提供矩阵格式的数据。现在,魔法来了。对于聚集条形图,您的变量需要出现在矩阵的行中,而不是常规列中。我的意思是,不是沿列存储数据:

       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() 函数和矩阵作为高度参数,不要忘记将'beside' 参数设置为TRUE

    以上代码的结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      相关资源
      最近更新 更多