Rimozione dei bordi nei grafici R per il raggiungimento dell'asse di Tufte


18

Considera il seguente grafico:

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)

Come posso rimuovere i bordi generati automaticamente e conservare solo le linee degli assi, per ottenere lo stile di Tufte?


5
Guarda l' btyargomento in ?par, per esempio bty="n",. Puoi passare questo argomento nella tua chiamata a plot.
Glen_b -Restate Monica

3
FWIW, Tufte è andato oltre: ha mostrato come in alcuni casi la cancellazione di parti degli assi stessi fornisca ulteriori informazioni, trasformando efficacemente ciascun asse in una visualizzazione visiva della gamma di dati. Ispirato da questo, nel 1989 ho scritto software per produrre piccoli grafici multipli che incorporavano questo design (tra molti altri ispirati al gruppo di Tufte e Bill Cleveland) e successivamente ho generato diversi milioni di tali grafici. Quando devi estrarre così tanti dati visivamente, tali principi funzionano davvero.
whuber

@whuber In effetti, stavi sostituendo gli assi con una sorta di trama del tappeto?
Silverfish,

2
@Silver Disegnare un tappeto è un problema a parte - e l'ho fatto anch'io. Tuttavia, anche in assenza di un tappeto, puoi scegliere dove fermarti e iniziare a disegnare ciascun asse. Quando lo avvii al minimo e lo fermi al massimo, hai ottenuto una rappresentazione visiva dell'intera gamma di ogni distribuzione marginale dei dati.
whuber

2
@whuber Grazie, ora capisco a cosa ti riferivi - Tufte lo definisce un "range-frame" (e suggerisce non solo di fermare le linee lì all'estremità, ma anche di usare le etichette finali per indicare i loro valori - quello che lui ha chiama il "range-frame con range-label"). Per i lettori successivi che desiderano un riferimento, questo è tratto da Visual Display of Quantitative Information, Capitolo 7 ("Elementi grafici multifunzione"). Dato che si tratta di una discussione molto apprezzata, sarebbe bello vedere un'illustrazione aggiunta (e data la domanda, un po 'di codice R) di ciò che "asse di Tufte" potrebbe davvero significare.
Silverfish,

Risposte:



5

Questo è semplice da fare, devi solo includere l'argomento axes=FALSE. Ritenere:

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)

inserisci qui la descrizione dell'immagine

Nota che funziona ugualmente bene per gli istogrammi:

windows()
hist(y1, axes=F)

inserisci qui la descrizione dell'immagine


4

Se usi

par(bty = 'n') 

Prima di chiamare la trama che lo riparerà per lo zoo. Potrebbe anche risolverlo per una varietà di situazioni in cui non è passabile al comando di stampa.

(Controlla l'opzione bty nella guida par () per altri tipi di frame per la trama)


0

Sto rispondendo alla domanda più generale sulla rimozione dei bordi nelle trame, senza fare riferimento a Tufte.

Per un istogramma non ho trovato che btn = 'n' si è sbarazzato del confine.

Una soluzione che funziona per gli istogrammi e dovrebbe funzionare per tutti i tipi di grafici è di impostare il tipo di linea per il bordo su invisibile: lty = "blank"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.