2012-10-15 7 views
9

Come posso rimuovere la casella intorno a xyplot, mantenendo i segni di graduazione della scala degli assi? Nello spirito dell'estetica minimalista dei dati di Edward Tufte, queste linee degli assi sono "inchiostro non-dati" e possono (dovrebbero?) Essere "cancellati".Controllo delle tacche degli assi e delle linee degli assi separatamente su R lattice xyplot

library(lattice) 
my.df <- data.frame(x=-10:10) 
my.df$y <- my.df$x^2 
xyplot(y~x,data=my.df) 

standard xyplot output

Sembra che i parametri di visualizzazione traliccio (es axis.line$col) controllare entrambe le linee e AXIS zecche insieme:

xyplot(y~x,data=my.df, 
     par.settings=list(axis.line=list(col="transparent"))) 

with axis.line$col="transparent"

... che è non il risultato desiderato, quindi non sembra che ci sia un modo semplice per spegnere le linee mentre si lascia la scatola.

Il meglio che ho potuto venire in mente è un hack forza bruta, in cui ho costruito i segni di graduazione a mano con panel.segments:

at.x=pretty(c(-10,10)) 
at.y=pretty(c(0,100)) 
xyplot(y~x,data=my.df, 
     par.settings=list(axis.line=list(col="transparent")), 
     scales=list(x=list(at=at.x,labels=at.x), 
     y=list(at=at.y,labels=at.y)), 
     panel=function(...){ 
      panel.xyplot(...) 
      panel.segments(x0=at.x,x1=at.x,y0=-4,y1=-2) 
      panel.segments(x0=-11.5,x1=-11,y0=at.y,y1=at.y) 
     } 
     ) 

hand-made tick marks with panel.segments

Questo è vicino alla risultato desiderato, ma è necessario un po 'di manipolazione per ottenere una lunghezza ragionevole dei segni di graduazione e compensare una "bella" distanza dai punti dati. Questi valori non verranno tradotti da un grafico all'altro. Inoltre, tieni presente che le etichette degli assi ora sono posizionate troppo lontano dai segni di graduazione. Sono sicuro che c'è un modo per ridurre quella imbottitura, ma questo renderebbe il codice ancora più brutto e meno portabile.

Quindi, come si può procedere eliminando solo le linee che compongono il "riquadro" attorno all'area del tracciato, lasciando intatti i segni di graduazione e le etichette degli assi? Punti bonus se questo approccio può anche essere usato per sopprimere alcune, ma non tutte le linee (ad esempio, lascia le linee sinistra e inferiore, ma sopprime le linee superiore e destra).

risposta

10

Questo è ancora un po 'hacky, ma almeno non devi fare alcun calcolo a mano. Esso utilizza una combinazione di par.settings e una funzione personalizzata axis che prende un argomento line.col temporaneamente cambia il colore della linea dell'asse da una chiamata al trellis.par.set:

EDIT (rimosso cambiamento non necessario di impostazioni traliccio)

xyplot(y~x,data=my.df, par.settings = list(axis.line = list(col = "transparent")), 
    # Pass custom axis function to argument 'axis' 
    axis = function(side, line.col = "black", ...) { 
    # Only draw axes on the left and bottom 
    if(side %in% c("left","bottom")) { 
     # Call default axis drawing function 
     axis.default(side = side, line.col = "black", ...) 
    } 
    } 
) 

Al momento, appunto perché è necessario utilizzare lo line.col = "black" negli argomenti della funzione asse personalizzata su magia. La mia ipotesi è che abbia a che fare con l'argomento che combacia con le ellissi (...). Forse domani sarò più saggio e troverò la vera ragione.

Questo si traduce in:

enter image description here

+0

Questo sembra fantastico. Ti dispiacerebbe fornire un piccolo commento su cosa fa ogni linea della funzione dell'asse e perché lo stai facendo?Sto trovando la documentazione di aiuto sulle funzioni degli assi di basso livello (come 'axis.default' non sono molto illuminante. – mac

+0

@mac, Si scopre che c'è stato un inutile cambio di opzioni a traliccio, e il vero trucco sembra essere quello di fornire la funzione asse personalizzata un argomento formale 'line.col'. – BenBarnes

+1

Nice. FWIW,' line.col = "black" 'è necessario perché' panel.axis() 'di default prende il colore della linea da' trellis.par. get ("axis.line") ', che hai precedentemente impostato su' "transparent". –

-1

La cosa più semplice da fare è quello di utilizzare la funzione dell'asse personalizzato (asse). Basta impostare lwd (larghezza della linea) su zero e spuntare i segni (lwd.ticks) su qualcos'altro. Ha funzionato come un fascino!

plot(NA,NA,type="n",xaxt="n", lwd=linewidth, xlim=c(1,24), xlab="", ylab="",ylim=c(-300,500)) 
axis(side = 4, tck = .05, **lwd=0, lwd.ticks=1**, line = 0, labels = NA, col= cols_border[1], col.axis = cols_black) 
axis(side = 4, lwd = 0, line = -4.5, las = 1, cex.axis=axis_fontsize, col= cols_border[1], col.axis = cols_black) 
mtext("Light deviations (lum/sec)",side=4, padj=-2.5, cex=title_fontsize, col="black") 
+0

Questo usa la grafica di base, mentre l'OP usa il pacchetto 'lattice'. – BenBarnes