update : Material copiado que estava no wiki do R em http://rwiki.sciviews.org/doku.php?id=tips:graphics-base:2yaxes , link agora quebrado: também disponível na máquina wayback
Dois eixos y diferentes no mesmo gráfico
(algum material originalmente de Daniel Rajdl 31/03/2006 15:26)
Observe que há muito poucas situações em que é apropriado usar duas escalas diferentes no mesmo gráfico. É muito fácil enganar o visualizador do gráfico. Verifique os dois exemplos e comentários a seguir sobre esse problema ( exemplo1 , exemplo2 da Junk Charts ), bem como este artigo de Stephen Few (que conclui “Certamente não posso concluir, de uma vez por todas, que gráficos com eixos de escala dupla nunca são útil, só que não consigo pensar em uma situação que os justifique à luz de outras soluções melhores. ”) Veja também o ponto 4 deste desenho animado ...
Se você estiver determinado, a receita básica é criar seu primeiro gráfico, definido par(new=TRUE)
para impedir que R limpe o dispositivo gráfico, criando o segundo gráfico com axes=FALSE
(e definindo xlab
e ficando ylab
em branco - ann=FALSE
também deve funcionar) e, em seguida, usando axis(side=4)
para adicionar um novo eixo no lado direito e mtext(...,side=4)
para adicionar um rótulo de eixo no lado direito. Aqui está um exemplo usando um pouco de dados 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()
no plotrix
pacote automatiza esse processo, como acontece doubleYScale()
no latticeExtra
pacote.
Outro exemplo (adaptado de uma postagem da lista de discussão de 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"))
Receitas semelhantes podem ser usadas para sobrepor gráficos de diferentes tipos - gráficos de barras, histogramas etc.