Xyplot решетки R не соответствует сетке делениям осей (не мультиплот)

Я пытаюсь создать график с помощью xyplot решетки с помощью следующего кода:

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

Как и ожидалось, получается красивый график:

Я бы хотел, чтобы сетка на графике была выровнена с делениями, сгенерированными equispaced.log=F. В документации xyplot grid обсуждается только в отношении нескольких графиков, как и в некоторых других потоках в SO и на других сайтах (фактически, я получил аргумент grid=T с другого сайта: Использование решетчатой ​​графики в R, и даже там видно, что при использовании equispaced.log=F сетка "не совпадает" с делениями) .

На всякий случай кто-то может подумать, что это дубликат SO: выравнивание -grid-lines-to-axis-ticks-in-lattice-graphics, пожалуйста, обратите внимание, что вопрос был в том, как выровнять сетки в мультиплоте (и в то время в теме еще не было ответа ).

Как заставить xyplot «выравнивать» линии сетки по x делениям при использовании equispaced.log=F? Спасибо!


person PavoDive    schedule 10.11.2014    source источник


Ответы (2)


Похоже, вам нужно использовать функцию пользовательской панели для этого и использовать panel.abline вместо panel.grid. Лучшее, что я смог придумать, это установить тикпойнты полувручную.

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

введите здесь описание изображения

person Thruston    schedule 01.01.2015
comment
Спасибо @Thruston, это определенно то, что мне было нужно в то время, я обязательно буду использовать его в будущем. Интересно, смогу ли я превратить ваш ответ в настоящий ответ, так как он разделяет его решеткой. - person PavoDive; 02.01.2015

Вот решение ggplot, если это полезно.

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

введите здесь описание изображения

person arvi1000    schedule 10.11.2014
comment
спасибо, это действительно полезно, я просто хотел бы знать, возможно ли это вообще в решетке. - person PavoDive; 10.11.2014