为什么格子图中的网格线覆盖*一些*但不是所有数据点?
Why do grid lines in lattice plot cover *some* but not all data points?
我正在尝试使用 R 中的 lattice 包创建一个图形。我知道其他现有的包,但如果可能的话我想使用 lattice。
为了向分组的 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),红色点在黑色网格线的前面,其他点都被覆盖了:
将不胜感激。
谢谢,
康拉德
package:latticeExtra 中有一个由 Sarkar 和 Andrews 编写的 +.trellis
函数。可以说,它在幕后处理所有复杂的网格调用。如果你对你的 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()
调试注意事项。我首先尝试在现在有 panel.ci2
的地方使用 panel.xyplot
并且只有实心点出现在前面,这让我意识到我也需要面板功能中的箭头。我认为使用 lty = 3
和 lwd=0.5
.
的 abline
调用使剧情看起来好多了
我正在尝试使用 R 中的 lattice 包创建一个图形。我知道其他现有的包,但如果可能的话我想使用 lattice。
为了向分组的 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),红色点在黑色网格线的前面,其他点都被覆盖了:
将不胜感激。
谢谢,
康拉德
package:latticeExtra 中有一个由 Sarkar 和 Andrews 编写的 +.trellis
函数。可以说,它在幕后处理所有复杂的网格调用。如果你对你的 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()
调试注意事项。我首先尝试在现在有 panel.ci2
的地方使用 panel.xyplot
并且只有实心点出现在前面,这让我意识到我也需要面板功能中的箭头。我认为使用 lty = 3
和 lwd=0.5
.
abline
调用使剧情看起来好多了