Lattice xyplot() 向每个面板添加不同的平均趋势线?
Lattice xyplot() Adding a different mean trend line to each panel?
我有一个简单的网格散点图。两个面板 - male/female。 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。
我相信 lattice 有一个特定的面板功能,panel.average()
。
尝试将 panel.abline(h=mean.values)
替换为 panel.average(...)
。
如果这不能解决问题,我们可能需要更多信息;尝试对您的数据使用 dput()
(例如,dput(DF)
,或一些有代表性的子集)。
如果你只是想绘制你正在绘制的值的平均值,你可以跳过 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)
)
这会产生
我有一个简单的网格散点图。两个面板 - male/female。 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 然后 -
制作 ggplothline.data <- data.frame(z = c(2413, 3690), Gender = c("Female","Male"))
这将创建两个均值和性别的 DF,2x2 DF
myplot <- myplot + geom_hline(aes(yintercept = z), hline.data)
这会将线条添加到 ggplot。
我相信 lattice 有一个特定的面板功能,panel.average()
。
尝试将 panel.abline(h=mean.values)
替换为 panel.average(...)
。
如果这不能解决问题,我们可能需要更多信息;尝试对您的数据使用 dput()
(例如,dput(DF)
,或一些有代表性的子集)。
如果你只是想绘制你正在绘制的值的平均值,你可以跳过 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)
)
这会产生