Lattice xyplot() Добавлять разные средние линии тренда на каждую панель?

У меня есть простая решетка рассеяния. Две панели - мужской / женский. 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() } } 

затем запись после графика решетки (средние значения - вектор двух чисел, средний для женщины, средний для мужчины)

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

Обновление - мне удалось сделать это в ggplot2. Создайте ggplot, используя facet_wrap, затем -

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.

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)
)

это производит

Я считаю, что решетка имеет специальную функцию панели для этого, panel.average(),

Попробуйте заменить panel.abline(h=mean.values) с panel.average(...),

Если это не решит проблему, нам может потребоваться дополнительная информация; попробуйте использовать dput() на ваших данных (например, dput(DF)или какое-то репрезентативное подмножество).

Другие вопросы по тегам