Suppression des bordures dans les tracés R pour atteindre l'axe de Tufte

18

Considérez le graphique suivant:

x <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100)+100

par(mar=c(5,5,5,5))

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2),ylab="")
axis(side=2, at=c(-2,0,2))
mtext("red line", side = 2, line=2.5, at=0)

par(new=T)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,108), ylab="")
axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
mtext("blue line", side=4, line=2.5, at=100)

Comment puis-je supprimer les bordures générées automatiquement et conserver uniquement les lignes d'axe, pour obtenir le style d'un Tufte?

Hugo Sereno Ferreira
la source
5
Regardez l' btyargument dans ?par, par exemple bty="n",. Vous pouvez transmettre cet argument dans votre appel à plot.
Glen_b -Reinstate Monica
3
FWIW, Tufte est allé plus loin: il a montré comment, dans certains cas, l'effacement de parties des axes eux-mêmes fournit des informations supplémentaires, transformant efficacement chaque axe en un affichage visuel de la plage de données. Inspiré par cela, en 1989, j'ai écrit un logiciel pour produire de petits graphiques multiples qui incorporaient cette conception (parmi de nombreux autres inspirés par le groupe de Tufte et Bill Cleveland) et ont ensuite généré plusieurs millions de ces graphiques. Lorsque vous devez extraire autant de données visuellement, ces principes fonctionnent vraiment.
whuber
@whuber Effectivement, étiez-vous en train de remplacer les axes par une sorte de tapis graphique?
Silverfish
2
@Silver Dessiner un tracé de tapis est un problème distinct - et je l'ai également fait. Cependant, même en l'absence d'un tracé de tapis, vous pouvez choisir où vous arrêter et commencer à dessiner chaque axe. Lorsque vous le démarrez au minimum et l'arrêtez au maximum, vous avez obtenu une représentation visuelle de la gamme complète de chaque distribution de données marginale.
whuber
2
@whuber Merci, je comprends maintenant de quoi vous parliez - Tufte appelle cela un "cadre de plage" (et suggère non seulement d'arrêter les lignes à l'extrema, mais aussi d'utiliser les étiquettes finales pour indiquer leurs valeurs - ce qu'il appelle le "range-frame with range-labels"). Pour les lecteurs ultérieurs souhaitant une référence, il s'agit de Visual Display of Quantitative Information, Chapter 7 ("Multifunctioning Graphical Elements"). Comme il s'agit d'un fil très consulté, il serait intéressant de voir une illustration ajoutée (et compte tenu de la question, du code R) de ce que "l'axe de Tufte" pourrait réellement signifier.
Silverfish

Réponses:

5

C'est simple à faire, vous incluez simplement l'argument axes=FALSE. Considérer:

x  <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100) + 100

windows()
  par(mar=c(5,5,5,5))
  plot(x, y1, pch=0, type="b", col="red", yaxt="n", ylim=c(-8,2), ylab="", axes=F)
  axis(side=2, at=c(-2,0,2))
  mtext("red line", side = 2, line=2.5, at=0)

  par(new=T)
  plot(x, y2, pch=1, type="b", col="blue", yaxt="n", ylim=c(98,108), ylab="", axes=F)
  axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
  mtext("blue line", side=4, line=2.5, at=100)

entrez la description de l'image ici

Notez que cela fonctionne aussi bien pour les histogrammes:

windows()
hist(y1, axes=F)

entrez la description de l'image ici

gung - Rétablir Monica
la source
4

Si tu utilises

par(bty = 'n') 

Avant d'appeler l'intrigue qui le réparera pour le zoo. Il peut également le corriger pour diverses situations où il n'est pas transmissible à la commande de traçage.

(Consultez l'option bty dans l'aide de par () pour d'autres types de cadres pour l'intrigue)

John
la source
0

Je réponds à la question plus générale de la suppression des frontières dans les parcelles, sans référence à Tufte.

Pour un histogramme, je n'ai pas trouvé que btn = 'n' s'était débarrassé de la frontière.

Une solution qui fonctionne pour les histogrammes et devrait fonctionner pour tous les types de tracés consiste à définir le type de ligne pour la bordure sur invisible: lty = "blank"

PeterVermont
la source