Update : Kopiertes Material, das sich im R-Wiki unter http://rwiki.sciviews.org/doku.php?id=tips:graphics-base:2yaxes befand , Link jetzt defekt: auch auf dem Wayback-Computer erhältlich
Zwei verschiedene y-Achsen auf demselben Plot
(etwas Material ursprünglich von Daniel Rajdl 31.03.2006 15:26)
Bitte beachten Sie, dass es nur sehr wenige Situationen gibt, in denen es angebracht ist, zwei verschiedene Skalen auf demselben Grundstück zu verwenden. Es ist sehr leicht, den Betrachter der Grafik irrezuführen. Überprüfen Sie die folgenden zwei Beispiele und Kommentare zu diesem Problem ( Beispiel 1 , Beispiel 2 aus Junk- Diagrammen ) sowie diesen Artikel von Stephen Few (der zu dem Schluss kommt: „Ich kann mit Sicherheit nicht ein für allemal schließen, dass Diagramme mit zwei skalierten Achsen niemals sind nützlich, nur dass ich mir keine Situation vorstellen kann, die sie angesichts anderer, besserer Lösungen rechtfertigt. “) Siehe auch Punkt 4 in diesem Cartoon ...
Wenn Sie fest entschlossen sind, besteht das Grundrezept darin, Ihr erstes Diagramm zu erstellen, par(new=TRUE)
zu verhindern, dass R das Grafikgerät löscht, das zweite Diagramm mit zu erstellen axes=FALSE
(und zu setzen xlab
und ylab
leer zu sein - ann=FALSE
sollte auch funktionieren) und dann axis(side=4)
eine neue Achse hinzuzufügen auf der rechten Seite und mtext(...,side=4)
zum Hinzufügen einer Achsenbeschriftung auf der rechten Seite. Hier ist ein Beispiel mit ein paar erfundenen Daten:
set.seed(101)
x <- 1:10
y <- rnorm(10)
## second data set on a very different scale
z <- runif(10, min=1000, max=10000)
par(mar = c(5, 4, 4, 4) + 0.3) # Leave space for z axis
plot(x, y) # first plot
par(new = TRUE)
plot(x, z, type = "l", axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(z)))
mtext("z", side=4, line=3)
twoord.plot()
im plotrix
Paket automatisiert diesen Prozess, wie doubleYScale()
im latticeExtra
Paket.
Ein weiteres Beispiel (angepasst aus einem R-Mailinglistenbeitrag von Robert W. Baer):
## set up some fake test data
time <- seq(0,72,12)
betagal.abs <- c(0.05,0.18,0.25,0.31,0.32,0.34,0.35)
cell.density <- c(0,1000,2000,3000,4000,5000,6000)
## add extra space to right margin of plot within frame
par(mar=c(5, 4, 4, 6) + 0.1)
## Plot first set of data and draw its axis
plot(time, betagal.abs, pch=16, axes=FALSE, ylim=c(0,1), xlab="", ylab="",
type="b",col="black", main="Mike's test data")
axis(2, ylim=c(0,1),col="black",las=1) ## las=1 makes horizontal labels
mtext("Beta Gal Absorbance",side=2,line=2.5)
box()
## Allow a second plot on the same graph
par(new=TRUE)
## Plot the second plot and put axis scale on right
plot(time, cell.density, pch=15, xlab="", ylab="", ylim=c(0,7000),
axes=FALSE, type="b", col="red")
## a little farther out (line=4) to make room for labels
mtext("Cell Density",side=4,col="red",line=4)
axis(4, ylim=c(0,7000), col="red",col.axis="red",las=1)
## Draw the time axis
axis(1,pretty(range(time),10))
mtext("Time (Hours)",side=1,col="black",line=2.5)
## Add Legend
legend("topleft",legend=c("Beta Gal","Cell Density"),
text.col=c("black","red"),pch=c(16,15),col=c("black","red"))
Ähnliche Rezepte können verwendet werden, um Diagramme verschiedener Typen zu überlagern - Balkendiagramme, Histogramme usw.