2014-01-24 2 views
1

Привет Я пытаюсь добавить среднюю линию к решетке с помощью графика XY следующего кода ... который не работает ...Как добавить среднюю строку к xyplot в R?

library(lattice) 
temp <- data.frame(c(1,1,1,1,1,1,2,2), 
     c(1,1,2,2,1,1,1,1), 
     c(1,1,1,2,1,2,1,2), 
     c(0,0,0,150,150,0,0,0), 
     c(3,10,4,15,14,2,4,5)) 
names(temp) <- c("instNo","NoOfAC","NoReleaseLevels","trExt","maxDelay") 

tempavg <- aggregate(temp[5], by=list(temp$NoOfAC,temp$NoReleaseLevels 
            ,temp$trExt),FUN = mean) 

names(tempavg) <- c("NoOfAC","NoReleaseLevels","trExt","meanDelay") 
xyplot(maxDelay ~ NoOfAC |trExt + NoReleaseLevels, 
      data = temp, 
      panel = function(x, y, tempavg) { 
       panel.xyplot(x, y) 
       panel.abline(tempavg$meanDelay ~ y |trExt + NoReleaseLevels) 
      }, 
xlab = "Number Of Aircraft in the Instance", 
ylab = "Total Delay (minutes)") 
+4

Код, который вы поставили для создания 'temp', не приближается к работе. (Попробуйте скопировать и вставить его в новую сессию R, чтобы увидеть это.) Если у вас есть «temp» из какого-то другого источника, возможно, сделайте 'dput (head (temp, 9))» и вставьте это в свой вопрос, чтобы сделать его воспроизводимым , –

ответ

2

Основная проблема с подходом, где это говорит, что panel.abline() принимает формулу в качестве первого аргумента? (Это не так!) Что такое ?panel.abline, так это то, что он принимает аргументы h и v (в частности, для случая, который вы имеете в виду), и вы хотите аргумент h.

Заметим также, что решетка вызывает функции панели с аргументами x и y, содержащих x и y данные для каждой панели нарисованной. Вам не нужно выполнять подмножество и агрегирование извне для этой работы; это делается для вас. Следовательно, вы должны думать в терминах x и y при рисовании с функциями панели.

В этом случае вы хотите panel.abline(h = mean(y), ...) в своей функции панели. ... позволяет передавать дополнительные аргументы, переданные функции панели, для распространения до вызовов функций внутри функции панели. Следовательно, ваша анонимная функция панели также должна принимать аргумент .... Это показано ниже.

## code as factor 
temp <- transform(temp, NoOfAC = factor(NoOfAC)) 

## plot 
xyplot(maxDelay ~ NoOfAC |trExt + NoReleaseLevels, 
      data = temp, 
      panel = function(x, y, ...) { 
       panel.xyplot(x, y, ...) 
       panel.linejoin(x, y, horizontal = FALSE, ...) 
      }, 
     xlab = "Number Of Aircraft in the Instance", 
     ylab = "Total Delay (minutes)") 
+0

Это добавляет среднее значение ко всем значениям, находящимся в y. Мне нужно найти среднее значение для каждого графика и для каждого отдельного значения NoOfAC в каждом графике – Tania

+0

Нет, это не так. Вы даже попробовали? У меня есть сюжет с 4 панелями с линией, нарисованной на панели «y». Это соответствует 4 из 5 значений в вашем 'tempavg'. Возможно, вы недостаточно хорошо объяснили свою проблему - почему есть 4 панели, но 5 означает «tempavg»? Трудно вам помочь, если вы не объясните, что хотите. –

+0

@Tania Если вы хотите передать данные, вы можете сделать это через '...', но тогда вам нужно будет определить, на какой панели вы находитесь (см. '? Panel.number') и выбрать значения из переданного в 'tempavg' в соответствии с' panel.number() '. Это в лучшем случае поражает меня. Вместо этого, если 'NoOfAC' рассматривается как категоричный, почему бы не закодировать его как таковой и не обустроить его? Тогда ** Lattice ** может легче делать то, что вы хотите. –

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