Entfernen von Rändern in R-Plots zum Erreichen der Tufte-Achse

18

Betrachten Sie das folgende Diagramm:

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)

Wie kann ich die automatisch generierten Ränder entfernen und nur die Achsenlinien beibehalten, um einen Tufte-Stil zu erzielen?

Hugo Sereno Ferreira
quelle
5
Schauen Sie sich zum Beispiel das btyArgument in an . Sie können dieses Argument in Ihrem Aufruf an übergeben . ?parbty="n"plot
Glen_b
3
FWIW, Tufte ging noch einen Schritt weiter: Er zeigte, wie das Löschen von Teilen der Achsen selbst in einigen Fällen zusätzliche Informationen liefert und so jede Achse in eine visuelle Anzeige des Datenbereichs verwandelt. Davon inspiriert habe ich 1989 Software geschrieben, um mehrere kleine Zeichnungen zu erstellen, die dieses Design enthielten (unter anderem inspiriert von Tufte und Bill Clevelands Gruppe) und anschließend mehrere Millionen solcher Grafiken erzeugten. Wenn Sie so viele Daten visuell gewinnen müssen, funktionieren solche Prinzipien wirklich.
whuber
@whuber Tatsächlich haben Sie die Äxte durch eine Art Teppich ersetzt?
Silverfish
2
@Silver Das Zeichnen eines Teppichgrundstücks ist ein separates Problem - und das habe ich auch getan. Selbst wenn keine Teppichzeichnung vorhanden ist, können Sie festlegen, wo die einzelnen Achsen gestoppt und gezeichnet werden sollen. Wenn Sie es am Minimum starten und am Maximum stoppen, haben Sie eine visuelle Darstellung des gesamten Bereichs jeder Randdatenverteilung erreicht.
whuber
2
@whuber Danke, ich verstehe jetzt, worauf Sie sich bezogen haben - Tufte nennt dies einen "Range-Frame" (und schlägt vor, die Linien dort nicht nur an den Extrema anzuhalten, sondern auch die endgültigen Bezeichnungen zu verwenden, um ihre Werte anzugeben - worauf er sich bezieht nennt den "Range-Frame mit Range-Labels"). Für spätere Leser, die eine Referenz wünschen, ist dies die visuelle Anzeige quantitativer Informationen, Kapitel 7 ("Multifunktionale grafische Elemente"). Da dies ein hoch angesehener Thread ist, wäre es schön zu sehen, dass eine Illustration hinzugefügt wird (und die Frage mit einem R-Code versehen wird), was "Tuftes Achse" wirklich bedeuten könnte.
Silverfish

Antworten:

5

Dies ist ganz einfach, Sie geben nur das Argument an axes=FALSE. Erwägen:

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)

Bildbeschreibung hier eingeben

Beachten Sie, dass dies für Histogramme gleichermaßen gut funktioniert:

windows()
hist(y1, axes=F)

Bildbeschreibung hier eingeben

gung - Wiedereinsetzung von Monica
quelle
4

Wenn du benutzt

par(bty = 'n') 

Vor dem Aufruf von Handlung, die es für den Zoo beheben wird. Es kann auch für eine Vielzahl von Situationen behoben werden, in denen es nicht an den Plotbefehl übergeben werden kann.

(Check out bty-Option in der par () -Hilfe für andere Arten von Frames für den Plot)

John
quelle
0

Ich beantworte die allgemeinere Frage, Grenzen in Parzellen zu entfernen, ohne auf Tufte Bezug zu nehmen.

Für ein Histogramm habe ich nicht gefunden, dass btn = 'n' die Grenze losgeworden ist.

Eine Lösung, die für Histogramme funktioniert und für alle Diagrammtypen funktionieren sollte, besteht darin, den Linientyp für den Rahmen auf unsichtbar zu setzen: lty = "blank"

PeterVermont
quelle