为什么格子图中的网格线覆盖*某些*但不是所有数据点?

时间:2017-06-14 20:22:13

标签: r lattice r-grid

我正在尝试使用R中的晶格包创建一个图形。我知道其他现有的包但是如果可能的话我想使用晶格。

为了将错误栏添加到分组的xyplot,我采用了Deepayan Sarkars解决方案,我找到了here(下面的代码)。

除非我尝试在图中添加网格线,否则它可以正常工作。网格线覆盖了一些数据点,但不是全部。有人理解为什么会这样以及如何避免它?我希望网格在后台绘制。

library(lattice)

# prepare sample data -----------------------------------------------
singer.split <- with(singer,
       split(height, voice.part))
singer.ucl <- sapply(singer.split,
         function(x) {
           st <- boxplot.stats(x)
           c(st$stats[3], st$conf)})

singer.ucl <- as.data.frame(t(singer.ucl))
names(singer.ucl) <- c("median", "lower", "upper")
singer.ucl$voice.part <- factor(rownames(singer.ucl),
         levels = rownames(singer.ucl))

singer.ucl$voice=factor(rep(c(1,2),4))
singer.ucl$range=factor(rep(c("Bass","Tenor","Alto","Soprano"),each=2))

# custom panel functions ----------------------------------------------
prepanel.ci <- function(x, y, ly, uy, subscripts, ...) {
  x <- as.numeric(x)
  ly <- as.numeric(ly[subscripts])
  uy <- as.numeric(uy[subscripts])
  list(ylim = range(y, uy, ly, finite = TRUE))}

panel.ci <- function(x, y, ly, uy, subscripts, pch = 16, col.line =
                       'black', ...) {
  x <- as.numeric(x)
  y <- as.numeric(y)
  ly <- as.numeric(ly[subscripts])
  uy <- as.numeric(uy[subscripts])
  panel.abline(v=1:2, col = "black", lwd = 2)
  panel.arrows(x, ly, x, uy, col = col.line,
               length = 0.25, unit = "native",
               angle = 90, code = 3)
  panel.xyplot(x, y, pch = pch, col.line = col.line, ...)}

# plot---------------------------------------------------------------
xyplot(median ~ voice,
       groups=range,
       data=singer.ucl,
       ly = singer.ucl$lower,
       uy = singer.ucl$upper,
       prepanel = prepanel.ci,
       panel = panel.superpose,
       panel.groups = panel.ci,
       type="p", pch = 19)

在我的机器上(macOS,R.3.4.0,lattice_0.20-35),红点位于黑色网格线的前面,所有其他点都被覆盖:

Red point in front of grid but other points in background

非常感谢帮助。

谢谢,

康拉德

1 个答案:

答案 0 :(得分:2)

包中有一个+.trellis函数:由Sarkar和Andrews撰写的latticeExtra。它处理幕后所有复杂的网格调用。如果您对panel.ci调用注释掉的abline函数略有不同,并将其命名为panel.ci2,则可以覆盖现有的绘图对象。

library(latticeExtra)  # perhaps need to install first
 my.plot <- xyplot(median ~ voice,
        groups=range,
        data=singer.ucl,
        ly = singer.ucl$lower,
        uy = singer.ucl$upper,
        prepanel = prepanel.ci,
        panel = panel.superpose,
        panel.groups = panel.ci,
        type="p", pch = 19)
 myplot2 <- my.plot + xyplot(median ~ voice,
                                     groups=range,
                                     data=singer.ucl,
                                     ly = singer.ucl$lower,
                                     uy = singer.ucl$upper,

                                     panel = panel.superpose,
                                     panel.groups = panel.ci2,
                                     type="p", pch = 19)
 png(); print( myplot2) ; dev.off()

enter image description here

关于调试的说明。我首先尝试在现在有panel.xyplot的地方使用panel.ci2,前面只有实心点,这让我意识到我也需要面板功能中的箭头。我认为通过使用ablinelty = 3进行lwd=0.5调用,情节会更好。