2014-11-10 13 views
5

Sto cercando di produrre una trama con xyplot del reticolo dal seguente codice:R reticolo xyplot non corrisponde griglia per zecche assi (non multiplo)

set.seed(123) #### make it reproducible 
df<-data.frame(x=runif(100,1,1e7),y=runif(100,0.01,.08),t=as.factor(sample(1:3,100,replace=T))) 
png("xyplot_grid_misaligned.png",800,800) 
p<-xyplot(y ~ x,groups=t,data=df,scales=list(x=list(log=10,equispaced.log=F)),auto.key=T,ylim=c(-.01,.1),grid=T) 
print(p) 
dev.off() 

Produce, come previsto, una bella trama: xyplot with grid misaligned

Mi piacerebbe che la griglia sul grafico fosse allineata con i segni di graduazione generati da equispaced.log=F. La documentazione di xyplot discute solo di grid in relazione a più trame, come alcuni altri thread in SO e altri siti (infatti, ho ottenuto lo grid=T argomento da un altro sito: Using Lattice graphics in R, e anche lì si può vedere che quando si usa equispaced.log=F, la griglia "disallinea" con le zecche).

Nel caso in cui qualcuno pensi che questo sia un duplicato di SO: aligning-grid-lines-to-axis-ticks-in-lattice-graphics, ti preghiamo di notare che la domanda in là era come allineare le griglie in un multiplot (e, al momento, il thread non ha ancora una risposta).

Come è possibile che xyplot "allinei" le linee della griglia alle x tick mentre si utilizza equispaced.log=F? Grazie!

risposta

3

sembra che è necessario utilizzare una funzione di pannello personalizzato per fare questo, e di utilizzare invece di panel.ablinepanel.grid. Il meglio che potrei fare è impostare i punti di spunta in modo semi-manuale.

library(lattice) 
set.seed(123) #### make it reproducible 

df<-data.frame(x=runif(100,1,1e7),y=runif(100,0.01,.08),t=as.factor(sample(1:3,100,replace=T))) 

# do this one by hand, since you had "equispaced.log=F" 
x.at = c(5e3, 10e3, 5e4, 10e4, 5e5, 10e5, 5e6, 10e6) 
# but this one is done with `pretty` as usual 
y.at = pretty(df$y,4) 

png("xyplot_grid_aligned.png",600,600) 
p <- xyplot(y ~ x,groups=t,data=df, 
      scales=list(x=list(at=x.at,log=10), 
         y=list(at=y.at)), 
      auto.key=T, 
      ylim=c(-.01,.1), 
      panel = function(...) { 
       panel.abline(v=log10(x.at),h=y.at,col="lightgrey") 
       panel.xyplot(...) 
      } 
      ) 
print(p) 
dev.off() 

enter image description here

+0

Grazie a @Thruston, è sicuramente quello di cui avevo bisogno in quel momento, sicuramente lo userò in futuro. Mi chiedo se posso trasformare la tua come la risposta "reale", come se la stesse tagliando con reticolo. – PavoDive

2

Ecco una soluzione ggplot, se è utile.

ggplot(df, aes(x=x, y=y, color=t)) + 
    geom_point(shape=21) + 
    scale_x_log10(breaks=c(5e3, 1e4, 5e4,1e5,5e5,1e6,5e6,1e7)) + 
    theme_bw() + 
    theme(panel.grid.minor=element_blank()) 

enter image description here

+0

grazie, è disponibile in effetti, ho appena piacerebbe sapere se è a tutto il possibile in lattice. – PavoDive

Problemi correlati