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)
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)