R中有3组的2个变量值之间的绘图栏

R中有3组的2个变量值之间的绘图栏,r,ggplot2,bar-chart,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) struc

我有以下资料:

> 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))
我想创建一个类似于以下的图形(这是手动绘制的,不能精确缩放;这里的数字都是错误的):


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

以下是使用
base
R执行此操作的方法:

  • 为你的小组选择一些颜色

    colrs <- c('#66c2a5', '#fc8d62', '#8da0cb')
    
  • 设置绘图区域。
    barplot
    的默认
    ylim
    对我来说有点紧,这会使最大值/最小值的文本标签变得困难。为了解决这个问题,我们首先生成一个最小值和最大值的冗余图,以便计算出更大的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)
    
  • rect
    绘制条形图。
    barplot
    绘制的条形图的默认宽度为
    1
    ,因此我们可以根据需要从中点(存储在
    p
    中)减去0.5

    rect(p - 0.5, mydf$var2, p + 0.5, mydf$var1, col=colrs)
    
  • 用方框整理并添加y轴

    box()
    axis(2, las=1, at=pretty(range(mydf[, 3:4])))
    
  • 如果要添加指示条形图结束值的文本标签,可以使用
    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)
    
  • box()
    axis(2, las=1, at=pretty(range(mydf[, 3:4])))
    
    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)