2016-02-29 3 views
3

Я хочу напечатать lattice::xyplot сгруппированными точками и строками, но у меня есть несколько значений y для многих значений x в каждой группе. Я хочу, чтобы сегментированная строка была напечатана, так что для каждого значения x она проходит через среднее значение соответствующих значений y в каждой группе.Lattice Plot - Добавить линии через средние значения y

Вот пример:

Используя эти данные:

set.seed(1) 
d <- data.frame(x=sample(6, 20, replace=TRUE), y=rnorm(20), g=factor(sample(2, 20, replace=TRUE))) 
# Shift one group 
d$y[d$g==2] = d$y[d$g==2] + 5 

Я сдвинуты одну группу, так что линии визуально более привлекательным.

Точечная сюжет выглядит следующим образом:

xyplot(y ~ x, data=d, groups=g) 

enter image description here

Просто добавив строки в реальный беспорядок:

xyplot(y ~ x, data=d, groups=g, type=c('p','l')) 

enter image description here

Это немного лучше, если вы сортировать значения x, но stil Я не то, что я хочу:

xyplot(y ~ x, data=d[order(d$x),], groups=g, type=c('p','l')) 

enter image description here

ответ

4

Я бы использовал panel.superpose, а затем выполнял агрегацию в функции панели группы. Например

xyplot(y ~ x, data=d, groups=g, panel=function(...) { 
    panel.xyplot(...); 
    panel.superpose(..., panel.groups=function(x,y,col.line,...) { 
     dd<-aggregate(y~x,data.frame(x,y),mean) 
     panel.xyplot(x=dd$x, y=dd$y, col=col.line, type="l") 
    }) 
}) 

Это приводит к

enter image description here

+0

Вот что я ищу. –

0
xyplot(y ~ x, data=d, groups=g, 
     panel = function(x, y, subscripts, groups, ...) {  
     grp <- as.numeric(groups[subscripts]) 
     col <- trellis.par.get()$superpose.symbol$col 
     panel.xyplot(x, y, subscripts=subscripts, groups=groups, ...) 
     for (g in unique(grp)) { 
      sel <- g == grp 
      m <- aggregate(list(y=y[sel]), list(x=x[sel]), FUN=mean) 
      panel.lines(m$x, m$y, col=col[g]) 
     } 
     } 
) 

enter image description here

Так что же здесь происходит? subscripts - это список индексов для каждой панели. В моем маленьком примере нет кондиционера, поэтому это 1:20. Аналогично groups - это список групп для панели. Опять же, есть одна панель, поэтому это d$g.

grp - это индекс каждой группы в своем коэффициенте.

col - это набор цветов, проиндексированных в функции panel.lines, чтобы выбрать тот же цвет, что и точки.

Для каждой группы вычисляется среднее значение для каждого значения x в этой группе и передается в panel.lines для координат.

+0

Есть ли лучший способ? –