2014-11-10 10 views
5

Ich versuche, ein Grundstück mit Gitter des xyplot durch den folgenden Code zu erzeugen:R Gitter xyplot entspricht nicht Raster Achsen Zecken (nicht Multiplot)

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() 

Es produziert, wie erwartet, eine schöne Plot: xyplot with grid misaligned

Ich möchte, dass das Raster auf dem Plot mit den von equispaced.log=F erzeugten Teilstrichen ausgerichtet wird. Die Dokumentation von xyplot diskutiert nur grid in Bezug auf mehrere Plots, wie auch einige andere Threads in SO und anderen Seiten (In der Tat, ich habe die grid=T Argumment von einer anderen Website: Using Lattice graphics in R, und auch dort können Sie sehen, dass, wenn equispaced.log=F verwendet wird, das Gitter "verschiebt sich" mit den Zecken).

Für den Fall, dass jemand denkt, dies ist ein Duplikat von SO: aligning-grid-lines-to-axis-ticks-in-lattice-graphics, beachten Sie bitte, dass die Frage darin war, wie man die Grids in einem Multiplot ausrichtet (und zu dem Zeitpunkt hat der Thread noch keine Antwort).

Wie kann ich xyplot "ausrichten" Gitterlinien zu x Ticks während der Verwendung equispaced.log=F? Danke!

Antwort

3

Es scheint, dass Sie eine eigene Panel-Funktion, dies zu tun verwenden müssen, und panel.abline statt panel.grid zu verwenden. Das Beste, was ich mir vorstellen kann, ist, die Tick-Punkte halb manuell zu setzen.

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

Dank @Thruston, es ist definitiv das, was ich zu der Zeit brauchte, sicherlich werde ich es in der Zukunft verwenden. Ich frage mich, ob ich deine als die "echte" Antwort, wie es sie mit Gitter ist, drehen kann. – PavoDive

2

Hier ist eine ggplot-Lösung, wenn das hilfreich ist.

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

Dank, ist es hilfreich, in der Tat, ich würde nur gerne wissen, ob es in Gittern überhaupt möglich ist. – PavoDive