mise à jour : matériel copié qui était sur le wiki R à http://rwiki.sciviews.org/doku.php?id=tips:graphics-base:2yaxes , lien maintenant cassé: également disponible sur la machine de retour
Deux axes y différents sur le même tracé
(certains documents à l'origine par Daniel Rajdl 2006/03/31 15:26)
Veuillez noter qu'il existe très peu de situations où il est approprié d'utiliser deux échelles différentes sur le même graphique. Il est très facile de tromper le spectateur du graphique. Consultez les deux exemples et commentaires suivants sur ce problème ( exemple1 , exemple2 de Junk Charts ), ainsi que cet article de Stephen Few (qui conclut: «Je ne peux certainement pas conclure, une fois pour toutes, que les graphiques avec des axes à double échelle ne sont jamais utile; seulement que je ne peux pas penser à une situation qui les justifie à la lumière d'autres solutions meilleures. ») Voir également le point 4 de cette caricature ...
Si vous êtes déterminé, la recette de base est de créer votre premier tracé, défini par(new=TRUE)
pour empêcher R d'effacer le périphérique graphique, de créer le deuxième tracé avec axes=FALSE
(et de définir xlab
et ylab
d'être vide - ann=FALSE
devrait également fonctionner), puis d'utiliser axis(side=4)
pour ajouter un nouvel axe sur le côté droit et mtext(...,side=4)
pour ajouter une étiquette d'axe sur le côté droit. Voici un exemple utilisant un peu de données inventées:
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()
dans le plotrix
package automatise ce processus, comme le fait doubleYScale()
dans le latticeExtra
package.
Un autre exemple (adapté d'un article de liste de diffusion R par 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"))
Des recettes similaires peuvent être utilisées pour superposer des graphiques de types différents - graphiques à barres, histogrammes, etc.