1

在此处输入图像描述

我有一个简单的格子散点图。两个面板 - 男性/女性。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 但不确定它是如何工作的,因为我没有当前行。(current.row(前缀))。

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

[编辑 - 这是我正在使用的实际数据] 我试图简化 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() } } 

然后在格子图之后写(mean.values 是两个数字的向量,女性的平均值,男性的平均值)

addLine(v=(mean.values), once=TRUE) 

更新 - 我设法在 ggplot2 中做到了。然后使用 facet_wrap 制作 ggplot -

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

这将创建两个均值和性别的 DF,2x2 DF

myplot <- myplot + geom_hline(aes(yintercept = z), hline.data)

这会将线条添加到 ggplot。

4

2 回答 2

2

如果您只想绘制您在绘图区域上绘制的值的平均值,您可以跳过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)
)

这会产生

在此处输入图像描述

于 2015-08-01T23:41:34.680 回答
0

我相信 lattice 对此有特定的面板功能,panel.average().

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

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

于 2015-08-01T21:48:24.133 回答