格子图 - 通过 y 值的平均值添加线条
Lattice Plot - Add lines through mean of y values
我想用分组的点和线打印一个 lattice::xyplot
,但我有多个 y
值用于每个组中的许多单独的 x
值。我想要打印一条分段线,以便对于每个 x
值,它通过每组中相关 y
值的平均值。
这是一个例子:
使用此数据:
set.seed(1)
d <- data.frame(x=sample(6, 20, replace=TRUE), y=rnorm(20), g=factor(sample(2, 20, replace=TRUE)))
# Shift one group
d$y[d$g==2] = d$y[d$g==2] + 5
我移动了一组,这样线条在视觉上更吸引人。
散点图如下所示:
xyplot(y ~ x, data=d, groups=g)
只是添加行真是一团糟:
xyplot(y ~ x, data=d, groups=g, type=c('p','l'))
如果对 x
值进行排序会好一些,但仍然不是我想要的:
xyplot(y ~ x, data=d[order(d$x),], groups=g, type=c('p','l'))
xyplot(y ~ x, data=d, groups=g,
panel = function(x, y, subscripts, groups, ...) {
grp <- as.numeric(groups[subscripts])
col <- trellis.par.get()$superpose.symbol$col
panel.xyplot(x, y, subscripts=subscripts, groups=groups, ...)
for (g in unique(grp)) {
sel <- g == grp
m <- aggregate(list(y=y[sel]), list(x=x[sel]), FUN=mean)
panel.lines(m$x, m$y, col=col[g])
}
}
)
这是怎么回事? subscripts
是每个面板的下标列表。在我的小例子中没有条件,所以它是 1:20
。同样,groups
是面板的组列表。同样,只有一个面板,所以这是 d$g
。
grp
是每个组在其因子中的索引。
col
是一组颜色,在 panel.lines
函数中索引为 select 与点相同的颜色。
对于每个组,计算该组中每个 x
值的平均值,并将其传递给 panel.lines
作为坐标。
我会使用 panel.superpose
,然后在组面板功能中进行聚合。例如
xyplot(y ~ x, data=d, groups=g, panel=function(...) {
panel.xyplot(...);
panel.superpose(..., panel.groups=function(x, y, col.line, ...) {
dd <- aggregate(y~x, data.frame(x,y), mean)
panel.xyplot(x=dd$x, y=dd$y, col=col.line, type="l")
})
})
这导致
我想用分组的点和线打印一个 lattice::xyplot
,但我有多个 y
值用于每个组中的许多单独的 x
值。我想要打印一条分段线,以便对于每个 x
值,它通过每组中相关 y
值的平均值。
这是一个例子:
使用此数据:
set.seed(1)
d <- data.frame(x=sample(6, 20, replace=TRUE), y=rnorm(20), g=factor(sample(2, 20, replace=TRUE)))
# Shift one group
d$y[d$g==2] = d$y[d$g==2] + 5
我移动了一组,这样线条在视觉上更吸引人。
散点图如下所示:
xyplot(y ~ x, data=d, groups=g)
只是添加行真是一团糟:
xyplot(y ~ x, data=d, groups=g, type=c('p','l'))
如果对 x
值进行排序会好一些,但仍然不是我想要的:
xyplot(y ~ x, data=d[order(d$x),], groups=g, type=c('p','l'))
xyplot(y ~ x, data=d, groups=g,
panel = function(x, y, subscripts, groups, ...) {
grp <- as.numeric(groups[subscripts])
col <- trellis.par.get()$superpose.symbol$col
panel.xyplot(x, y, subscripts=subscripts, groups=groups, ...)
for (g in unique(grp)) {
sel <- g == grp
m <- aggregate(list(y=y[sel]), list(x=x[sel]), FUN=mean)
panel.lines(m$x, m$y, col=col[g])
}
}
)
这是怎么回事? subscripts
是每个面板的下标列表。在我的小例子中没有条件,所以它是 1:20
。同样,groups
是面板的组列表。同样,只有一个面板,所以这是 d$g
。
grp
是每个组在其因子中的索引。
col
是一组颜色,在 panel.lines
函数中索引为 select 与点相同的颜色。
对于每个组,计算该组中每个 x
值的平均值,并将其传递给 panel.lines
作为坐标。
我会使用 panel.superpose
,然后在组面板功能中进行聚合。例如
xyplot(y ~ x, data=d, groups=g, panel=function(...) {
panel.xyplot(...);
panel.superpose(..., panel.groups=function(x, y, col.line, ...) {
dd <- aggregate(y~x, data.frame(x,y), mean)
panel.xyplot(x=dd$x, y=dd$y, col=col.line, type="l")
})
})
这导致