2015-08-01 2 views
1

enter image description hereLattice xyplot() Добавление другой средней линии тренда к каждой панели?

У меня есть простая решетка рассеивания решетки. Две панели - мужчина/женщина. ID - уникальный номер для каждого участника. Var1 - это общее время тестирования. Среднее значение - это вектор двух чисел (средство для пола).

Нет точки, включая линию наилучшего соответствия, так что я хочу построить линию тренда на каждой панели. Две панели имеют разные средства, например, мужчина = 1 минута, женщина = 2 минуты.

xyplot(var1 ~ ID|Gender, data=DF,     
        group = Gender, 
        panel=function(...) { 
        panel.xyplot(...) 
        panel.abline(h=mean.values) 
        }) 

В тот момент, когда график выходит, так что обе линии тренда появляются на каждой панели. Я хочу только одну линию тренда в каждом.

У кого-нибудь есть способ сделать это?

Я пробовал несколько различных способов, включая длинный код для функции Addline, который просто не работает для меня. Я просто хочу определить, на какой панели я смотрю, и я посмотрел на? Panel.number, но не уверен, как это работает, поскольку я думаю, что у меня нет текущей строки. (Current.row (префикс)).

Должен быть простой способ сделать это?

[EDIT - Вот фактические данные, я использую] Я попытался упростить 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 строки.

[EDIT - это код, который включает в себя функцию 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. Сделать ggplot используя facet_wrap затем -

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

Это создает DF двух средств и Пол, 2х2 DF

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

Это добавляет строки в ggplot.

+0

Является ли «mean.values» средством e 'var1' значения? Это поможет, если вы предоставили [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) с примерными входными данными. – MrFlick

+0

Да, это правильно - среднее значение var1. Скоро я получу данные, просто задаваясь вопросом, не пропадет ли что-то что-то очевидное. – Rachel

ответ

2

Если вы просто хотели построить среднее значений вы опирающиеся на участке aready, вы можете пропустить переменную 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) 
) 

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

enter image description here

+0

Это занимает среднее значение для всего Var1 без учета мужчины/женщины, и поэтому он отображает одну линию на обеих панелях. Я ищу среднюю линию для женщин и среднюю линию для мужчин. – Rachel

+0

Это вычисляет среднее значение для каждой панели, и поскольку вы определяете пол, это означает, что он вычисляет другое среднее значение для каждого пола. Я не уверен, почему вы думаете, что он вычисляет только среднее значение. – MrFlick

+0

Когда я сам его закодировал, он не разделил строки на панели и не дал только одну общую среднюю линию, которая была болью. Вероятно, это из-за DF, но я получил его в ggplot, поэтому я счастлив. Полагаю, это ответ, поскольку он, скорее всего, будет работать для других людей! Приветствия. – Rachel

0

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

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

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

+0

Я упростил в post-dput массивный выход. Я попробую и принесу первые 5 значений каждого типа «пол» - это не гендер, на который я смотрел, но легче объяснить;) – Rachel

+0

Кроме того, я раньше пытался попробовать panel.average(), но боролся с перечислением x, y. Я сначала попробую это быстро. – Rachel

+0

Не похоже, что 'panel.average' предназначен для достижения запросов OP. – BenBarnes

 Смежные вопросы

  • Нет связанных вопросов^_^