2012-03-24 22 views
4

Ich habe folgende DatenBarPlot mit 2 Variablen, 2 Y-Achse

test<-data.frame(group=1:10, var.a=rnorm(n=10,mean=500,sd=20), var.b=runif(10)) 

I eine BarPlot mit 2 y-Achse möchte (ein für var.a, ein für Var.2). Jede Gruppe (x-Achse, 1:10) sollte 2 Balken nebeneinander haben, einen für var.a und einen für var.b.

Ich kann nicht eine y-Achse verwenden, da der Unterschied morder der Größenordnung von var.a und var.b

Ist das möglich mit der Basis R?

Danke

Antwort

7

Um das graphics Paket in R zu verwenden, eine neue Variablen wie die Werte in var.a und var.b in Anteile der Maximalwerte in dem jeweiligen Variable umgewandelt schaffen könnte:

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

Dann Zeichnen Sie die Zeichnung mit barplot() ohne die Achsen:

barplot(t(as.matrix(test[, c("var.a.prop", "var.b.prop")])), beside = TRUE, 
    yaxt = "n", names.arg = test$group) 

Dann fügen Sie die Achsen links und rechts hinzu, indem Sie die ursprünglichen Wertebereiche für die Beschriftungen (das labels Argument) und die proportionalen Wertebereiche verwenden, um die Beschriftungen auf die Achsen zu setzen (das at Argument) (dieser Teil ist nicht hübsch, aber er wird auch erledigt den Job):

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

(Sorry für den Mangel eines Bildes)

EDIT:

zu den Achsen ein wenig pretty er zu bekommen,

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

Sehr schlauer Weg. Vielen Dank. Gibt es eine Möglichkeit, die Achse etwas hübscher aussehen zu lassen? – ECII

+1

@ECII, siehe oben für einen Vorschlag, um schönere Achsen zu erhalten. – BenBarnes