R Lattice xyplot()是否向每个面板添加不同的平均趋势线?

R Lattice xyplot()是否向每个面板添加不同的平均趋势线?,r,lattice,trellis,R,Lattice,Trellis,我有一个简单的网格散点图。两个面板-男性/女性。ID是每个参与者的唯一编号。var1是总测试时间。Mean.values是两个数字的向量(性别的平均值) 并没有点包括一条最佳拟合线,所以我想要的是在每个面板中绘制一条平均值的趋势线。这两个面板有不同的方法,比如男性=1分钟,女性=2分钟 xyplot(var1 ~ ID|Gender, data=DF, group = Gender, pa

我有一个简单的网格散点图。两个面板-男性/女性。ID是每个参与者的唯一编号。var1是总测试时间。Mean.values是两个数字的向量(性别的平均值)

并没有点包括一条最佳拟合线,所以我想要的是在每个面板中绘制一条平均值的趋势线。这两个面板有不同的方法,比如男性=1分钟,女性=2分钟

xyplot(var1 ~ ID|Gender, data=DF,                
                   group = Gender,
                   panel=function(...) { 
                     panel.xyplot(...) 
                     panel.abline(h=mean.values) 
                    })
在图形出来的那一刻,两条趋势线都出现在每个面板中。我只想在每个趋势线

有人有办法做到这一点吗

我尝试了许多不同的方法,包括函数Addline的长代码,但这对我来说并不适用。我只想定义我正在查看的面板和我已经查看的面板?panel.number,但不确定它是如何工作的,因为接下来我没有当前行。(当前行(前缀))

必须有一个简单的方法来做到这一点

[编辑-这是我正在使用的实际数据] 我试图简化DF

library(lattice) 

dput(head(DF))
structure(list(ID = 1:6, Var1 = c(2333858, 4220644, 
2941774, 2368496, 3165740, 3630300), mean = c(2412976, 2412976, 
2412976, 2412976, 2412976, 2412976), Gender = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("1", "2"), class = "factor")), .Names = c("ID", 
"Var1", "mean", "Gender"), row.names = c(NA, 6L), class = "data.frame")

dput(tail(DF))
structure(list(ID = 161:166, Var1= c(2825246, 3552170, 
3688882, 2487760, 3849108, 3085342), mean = c(3689805, 3689805, 
3689805, 3689805, 3689805, 3689805), Gender = structure(c(2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor")), .Names = c("ID", 
"Var1", "mean", "Gender"), row.names = 109:114, class = "data.frame")
我正在使用的绘图:

 xyplot((Var1/1000) ~ ID|Gender, data=DF,                
   group = Gender,scales=list(x=list(at=NULL)),
   panel=function(...) { 
     panel.xyplot(...) 
     panel.abline(h=mean.values) })
导致2行

[编辑-这是包含函数Addline的代码&在所有帖子中随处可见,似乎对我不起作用]

 addLine<- function(a=NULL, b=NULL, v = NULL, h = NULL, ..., once=F) { tcL <- trellis.currentLayout() k<-0 for(i in 1:nrow(tcL)) for(j in 1:ncol(tcL)) if (tcL[i,j] > 0) {  k<-k+1 trellis.focus("panel", j, i, highlight = FALSE) if (once) panel.abline(a=a[k], b=b[k], v=v[k], h=h[k], ...) else  panel.abline(a=a,b=b, v=v, h=h, ...) trellis.unfocus() } } 
更新-我设法在ggplot2中完成。 然后使用facet_wrap绘制ggplot-

hline.data <- data.frame(z = c(2413, 3690), Gender = c("Female","Male")) 

hline.data我相信lattice为此有一个特定的面板功能,
panel.average()

尝试将
panel.abline(h=mean.values)
替换为
panel.average(…)


如果这不能解决问题,我们可能需要更多的信息;尝试在数据上使用
dput()
(例如,
dput(DF)
,或一些代表性子集)。

如果您只想在绘图区域dy上绘制值的平均值,可以跳过
mean.values
变量,只需这样做

xyplot(Var1 ~ ID|Gender, data=DF,                
    group = Gender,
    panel=function(x,y,...) { 
        panel.xyplot(x,y,...) 
        panel.abline(h=mean(y)) 
    }
)
使用样本数据

DF<-data.frame(
    ID=1:10, 
    Gender=rep(c("M","F"), each=5), 
    Var1=c(5,6,7,6,5,8,9,10,8,9)
)

DFIs
mean.values
var1
值的平均值是多少?如果您提供了一个输入数据示例,这将有所帮助。是的,这是正确的-var1的平均值。我将很快得到数据,只是想知道我是否遗漏了一些明显的东西。我在后期简化了dput,它提供了大量的输出。我会尝试将每种“性别”类型的前5个值带到这里——我看到的不是性别,而是更容易解释的;)另外,我之前也尝试过panel.average(),但在列出x,y时遇到了困难。我会很快再试一次。似乎
面板。average
并不意味着要达到OP的要求。这需要整个Var1的平均值,而不考虑男性/女性,因此它会在两个面板上绘制一条线。我在寻找一条女性的平均线和一条男性的平均线。这会计算每个面板的平均值,因为你的条件是性别,这意味着它会计算每个性别的不同平均值。我不知道你为什么认为它只计算一个总体平均值。当我自己编码它时,它不会按面板分开线,只给出一个总体平均值线,这是一个痛苦。这可能是因为DF,但我让它在ggplot中工作,所以我很高兴。把这个作为答案,因为它可能会为其他人工作!干杯
xyplot(Var1 ~ ID|Gender, data=DF,                
    group = Gender,
    panel=function(x,y,...) { 
        panel.xyplot(x,y,...) 
        panel.abline(h=mean(y)) 
    }
)
DF<-data.frame(
    ID=1:10, 
    Gender=rep(c("M","F"), each=5), 
    Var1=c(5,6,7,6,5,8,9,10,8,9)
)