2014-11-10 26 views
5

Tôi đang cố gắng để tạo ra một âm mưu với xyplot lưới bằng đoạn mã sau:R lưới xyplot không phù hợp với mạng lưới để ve trục (không 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() 

Nó tạo ra, như mong đợi, một đẹp cốt truyện: xyplot with grid misaligned

tôi muốn lưới trên cốt truyện được liên kết với các dấu tick được tạo ra bởi equispaced.log=F. Tài liệu của xyplot chỉ thảo luận về grid liên quan đến nhiều ô, cũng như một số chủ đề khác trong SO và các trang web khác (Trên thực tế, tôi đã nhận được số grid=T argumment từ một trang web khác: Using Lattice graphics in R, và thậm chí ở đó bạn có thể thấy rằng khi sử dụng equispaced.log=F lưới "lệch hướng" với bọ ve).

Chỉ trong trường hợp ai đó có thể cho rằng đây là bản sao của SO: aligning-grid-lines-to-axis-ticks-in-lattice-graphics, vui lòng lưu ý rằng câu hỏi trong đó là cách căn chỉnh lưới trong một hệ số nhân (và tại thời điểm đó, chuỗi chưa có câu trả lời).

Làm cách nào để có xyplot "căn chỉnh" các đường lưới với x trong khi đang sử dụng equispaced.log=F? Cảm ơn!

Trả lời

3

Có vẻ như bạn cần phải sử dụng một chức năng bảng điều khiển tùy chỉnh để làm điều này, và sử dụng panel.abline thay vì panel.grid. Điều tốt nhất tôi có thể nghĩ ra là đặt các điểm đánh dấu bán thủ công.

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

Cảm ơn @Thruston, nó chắc chắn là những gì tôi cần vào thời điểm đó, chắc chắn tôi sẽ sử dụng nó trong tương lai. Tôi tự hỏi liệu tôi có thể biến bạn thành câu trả lời "thực sự" hay không, vì nó giải quyết nó bằng lưới. – PavoDive

2

Đây là giải pháp ggplot, nếu điều đó hữu ích.

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

cảm ơn, nó là hữu ích thực sự, tôi chỉ muốn biết nếu nó ở tất cả các khả năng trong lưới. – PavoDive

Các vấn đề liên quan