我有以下数据:
> 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)?颜色可以是任何颜色。条形宽度需要相同(黑条在这里看起来更宽,因为它是手动创建的图形)。谢谢你的帮助。
答案 0 :(得分:3)
以下是base
R:
为您的论坛选择一些颜色。
colrs <- c('#66c2a5', '#fc8d62', '#8da0cb')
在绘图右侧添加一些空格,并将剪裁扩展到图形区域,以允许绘制图例。
par(mar=c(5.1, 4.1, 4.1, 6.1), xpd=TRUE)
设置绘图区域。 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)
添加带有负插图的图例,以防止与条形重叠。
legend('topright', unique(mydf$grp), fill=colrs, inset=c(-0.15, 0))
使用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)