我有以下数据
test<-data.frame(group=1:10, var.a=rnorm(n=10,mean=500,sd=20), var.b=runif(10))
Run Code Online (Sandbox Code Playgroud)
我想要一个2轴的条形图(一个用于var.a,一个用于var.2).每组(x轴,1:10)应该有2个彼此相邻的条,一个用于var.a,一个用于var.b.
我不能使用一个y轴,因为var.a和var.b的幅度不同
这可能与基地R?
谢谢
要graphics在R中使用包,可以创建新变量作为值var.a并将其var.b转换为相应变量中最大值的比例:
test <- data.frame(group = 1:10, var.a = rnorm(n = 10, mean = 500, sd = 20),
var.b = runif(10))
funProp <- function(testCol) {
test[, testCol]/max(test[, testCol])
}
test$var.a.prop <- funProp("var.a")
test$var.b.prop <- funProp("var.b")
Run Code Online (Sandbox Code Playgroud)
然后在barplot()没有轴的情况下绘制绘图:
barplot(t(as.matrix(test[, c("var.a.prop", "var.b.prop")])), beside = TRUE,
yaxt = "n", names.arg = test$group)
Run Code Online (Sandbox Code Playgroud)
然后使用标签的原始值范围(labels参数)和比例值范围在左侧和右侧添加轴以将标签放置在轴上(at参数)(这部分不是很漂亮,但它可以得到工作完成):
axis(2, at = seq(0, max(test$var.a.prop), length.out = 10),
labels = round(seq(0, max(test$var.a), length.out = 10)))
axis(4, at = seq(0, max(test$var.b.prop), length.out = 10),
labels = round(seq(0, max(test$var.b), length.out = 10), 2))
Run Code Online (Sandbox Code Playgroud)
(抱歉没有图片)
编辑:
为了让轴更加pretty呃
myLeftAxisLabs <- pretty(seq(0, max(test$var.a), length.out = 10))
myRightAxisLabs <- pretty(seq(0, max(test$var.b), length.out = 10))
myLeftAxisAt <- myLeftAxisLabs/max(test$var.a)
myRightAxisAt <- myRightAxisLabs/max(test$var.b)
barplot(t(as.matrix(test[, c("var.a.prop", "var.b.prop")])),
beside = TRUE, yaxt = "n", names.arg = test$group,
ylim=c(0, max(c(myLeftAxisAt, myRightAxisAt))))
axis(2, at = myLeftAxisAt, labels = myLeftAxisLabs)
axis(4, at = myRightAxisAt, labels = myRightAxisLabs)
Run Code Online (Sandbox Code Playgroud)