actualización : material copiado que estaba en la wiki de R en http://rwiki.sciviews.org/doku.php?id=tips:graphics-base:2yaxes , enlace ahora roto: también disponible en la máquina wayback
Dos ejes y diferentes en la misma gráfica
(algo de material originalmente de Daniel Rajdl 2006/03/31 15:26)
Tenga en cuenta que hay muy pocas situaciones en las que sea apropiado utilizar dos escalas diferentes en el mismo gráfico. Es muy fácil engañar al espectador del gráfico. Consulte los siguientes dos ejemplos y comentarios sobre este tema ( ejemplo1 , ejemplo2 de Junk Charts ), así como este artículo de Stephen Few (que concluye "Ciertamente no puedo concluir, de una vez por todas, que los gráficos con ejes de doble escala nunca útil; solo que no puedo pensar en una situación que los justifique a la luz de otras soluciones mejores ”). Vea también el punto # 4 en esta caricatura ...
Si está decidido, la receta básica es crear su primer gráfico, configurado par(new=TRUE)
para evitar que R borre el dispositivo gráfico, crear el segundo gráfico con axes=FALSE
(y configurar xlab
y ylab
estar en blanco - ann=FALSE
también debería funcionar) y luego usar axis(side=4)
para agregar un nuevo eje en el lado derecho, y mtext(...,side=4)
para agregar una etiqueta de eje en el lado derecho. Aquí hay un ejemplo que usa un poco de datos inventados:
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()
en el plotrix
paquete automatiza este proceso, al igual que doubleYScale()
en el latticeExtra
paquete.
Otro ejemplo (adaptado de una publicación de la lista de correo de R por 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"))
Se pueden usar recetas similares para superponer gráficos de diferentes tipos: gráficos de barras, histogramas, etc.