R中2个变量值与3个组之间的绘图条

时间:2015-01-04 05:05:33

标签: r ggplot2 bar-chart

我有以下数据:

> mydf
  name grp var1 var2
1   aa   x  120   80
2   bb   x  128   86
3   cc   x  132   98
4   aa   y  125   85
5   bb   y  130   88
6   cc   y  138   99
7   aa   z  127   87
8   bb   z  132   89
9   cc   z  138  102

> dput(mydf)
structure(list(name = c("aa", "bb", "cc", "aa", "bb", "cc", "aa", 
"bb", "cc"), grp = c("x", "x", "x", "y", "y", "y", "z", "z", 
"z"), var1 = c(120L, 128L, 132L, 125L, 130L, 138L, 127L, 132L, 
138L), var2 = c(80L, 86L, 98L, 85L, 88L, 99L, 87L, 89L, 102L)), .Names = c("name", 
"grp", "var1", "var2"), class = "data.frame", row.names = c(NA, 
-9L))

我想创建一个类似于以下的图形(手动绘制,不准确缩放;这里的数字都错了):

enter image description here

如何做到这一点(最好用ggplot)?颜色可以是任何颜色。条形宽度需要相同(黑条在这里看起来更宽,因为它是手动创建的图形)。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

以下是base R:

的方法
  1. 为您的论坛选择一些颜色。

    colrs <- c('#66c2a5', '#fc8d62', '#8da0cb')
    
  2. 在绘图右侧添加一些空格,并将剪裁扩展到图形区域,以允许绘制图例。

    par(mar=c(5.1, 4.1, 4.1, 6.1), xpd=TRUE)
    
  3. 设置绘图区域。 ylim的默认barplot对我来说有点紧张,并且会使您的最大/最小值的文字标签变得困难。为了解决这个问题,我们首先生成最小值和最大值的冗余图,以便计算更大的y限值。 barplot调用现在可以使用par('usr')来控制y轴限制。将barplot的结果分配给p可确保条形码“中点被保存。

    plot(unlist(mydf[, 3:4]), type='n', axes=FALSE, xlab='', ylab='', las=1)
    p <- barplot(xtabs(var1 ~ grp + name, mydf), beside=TRUE, col=NA, border=NA,
                 las=1, ylim=par('usr')[3:4], axes=FALSE)
    
  4. 添加带有负插图的图例,以防止与条形重叠。

    legend('topright', unique(mydf$grp), fill=colrs, inset=c(-0.15, 0))
    
  5. 使用rect绘制条形图。由barplot绘制的默认条形宽度为1,因此我们可以根据需要从中间点(存储在p中)中减去并添加0.5。

    rect(p - 0.5, mydf$var2, p + 0.5, mydf$var1, col=colrs)
    
  6. 整理一个方框并添加y轴。

    box()
    axis(2, las=1, at=pretty(range(mydf[, 3:4])))
    
  7. enter image description here

    1. 如果您想添加指示条形结束值的文字标签,可以使用text

      text(p, mydf$var2, mydf$var2, adj=c(0.5, 1.2), cex=0.9)
      text(p, mydf$var1, mydf$var1, adj=c(0.5, -0.2), cex=0.9)
      
    2. enter image description here