R网格xyplot并不匹配网格到轴的关系'刻度(不是多重绘图)

时间:2014-11-10 15:45:04

标签: r plot lattice logarithm r-grid

我正在尝试通过以下代码生成带有格子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()

正如预期的那样,它产生了一个美丽的情节: xyplot with grid misaligned

我希望绘图上的网格与equispaced.log=F生成的刻度线对齐。 xyplot的文档仅讨论与多个图相关的grid,SO和其他站点中的其他一些线程也是如此(实际上,我从另一个站点得到了grid=T argumment:Using Lattice graphics in R,甚至在那里你可以看到,当使用equispaced.log=F时,网格与标记“错位”。

如果有人认为这是SO: aligning-grid-lines-to-axis-ticks-in-lattice-graphics的副本,请注意那里的问题是如何在多个时间段中对齐网格(当时,线程还没有答案) 。

使用 equispaced.log=F 时,如何将xyplot“对齐”网格线与x刻度? 谢谢!

2 个答案:

答案 0 :(得分:3)

您似乎需要使用自定义面板功能来执行此操作,并使用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()

enter image description here

答案 1 :(得分:2)

这是一个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())

enter image description here