2016-02-12 62 views
1

我想繪製兩個面板的晶格stripplot中兩個不同條件的個別主題手段。我還想添加我已經計算並存儲在單獨數據框中的主題置信區間。我試圖用latticeExtra的layer函數覆蓋這些置信區間。當我添加圖層時,如果我在layer命令中將[subscripts]添加到x和y中,則兩個面板上都會顯示兩組間隔(如代碼和第一張圖像所示),或者兩組間隔僅顯示在第一個面板上在下面的第二個代碼片段和圖像中說明)。我如何獲得適當的時間間隔以在適當的面板上顯示?晶格中面板的條件層

library(latticeExtra) 

raw_data <- data.frame(subject = rep(1:6, 4), cond1 = as.factor(rep(1:2, each = 12)), cond2 = rep(rep(c("A", "B"), each = 6), 2), response = c(2:7, 6:11, 3:8, 7:12)) 
summary_data <- data.frame(cond1 = as.factor(rep(1:2, each = 2)), cond2 = rep(c("A", "B"), times = 2), mean = aggregate(response ~ cond2 * cond1, raw_data, mean)$response, within_ci = c(0.57, 0.54, 0.6, 0.63)) 
summary_data$lci <- summary_data$mean - summary_data$within_ci 
summary_data$uci <- summary_data$mean + summary_data$within_ci 

subject_stripplot <- stripplot(response ~ cond1 | cond2, groups = subject, data = raw_data, 
    panel = function(x, y, ...) { 
    panel.stripplot(x, y, type = "b", lty = 2, ...) 
    panel.average(x, y, fun = mean, lwd = 2, col = "black", ...) # plot line connecting means 
    } 
) 
addWithinCI <- layer(panel.segments(x0 = cond1, y0 = lci, x1 = cond1, y1 = uci, subscripts = TRUE), data = summary_data, under = FALSE) 
plot(subject_stripplot + addWithinCI) 

在兩個面板與兩組間隔的Stripplot:

addWithinCI2 <- layer(panel.segments(x0 = cond1[subscripts], y0 = lci[subscripts], x1 = cond1[subscripts], y1 = uci[subscripts], subscripts = TRUE), data = summary_data, under = FALSE) 
plot(subject_stripplot + addWithinCI2) 

Stripplot僅與第一面板

回答

0

一個上兩組間隔的可能的解決方案是t (例如,在png或任何其他圖形設備內)並隨後使用trellis.focus修改每個子面板。

## display stripplot 
print(subject_stripplot) 

## loop over grops 
for (i in c("A", "B")) { 

    # subset of current group 
    dat <- subset(summary_data, cond2 == i) 

    # add intervals to current panel 
    trellis.focus(name = "panel", column = ifelse(i == "A", 1, 2), row = 1) 
    panel.segments(x0 = dat$cond1, y0 = dat$lci, 
       x1 = dat$cond1, y1 = dat$uci, subscripts = TRUE) 
    trellis.unfocus() 
} 

enter image description here

另一個(可能更方便)的解決方案是創建一個單獨的xyplot並設定下和上y的值(y0y1)傳遞到panel.segments在當前panel.number的依賴手動。與此相反,使用trellis.focus初始方法中,由此創建情節可以被存儲在一個變量,因此是可用於隨後處理的內部R.

p_seg <- xyplot(lci ~ cond1 | cond2, data = summary_data, ylim = c(1, 13), 
     panel = function(...) { 
     # lower and upper y values 
     y0 <- list(summary_data$lci[c(1, 3)], summary_data$lci[c(2, 4)]) 
     y1 <- list(summary_data$uci[c(1, 3)], summary_data$uci[c(2, 4)]) 
     # insert vertical lines depending on current panel 
     panel.segments(x0 = 1:2, x1 = 1:2, 
         y0 = y0[[panel.number()]], 
         y1 = y1[[panel.number()]]) 
     }) 

p_comb <- subject_stripplot + 
    as.layer(p_seg) 

# print(p_comb) 
0

不需要latticeExtra(從鄧肯麥凱)另一種解決方案:

summary_data$cond3 <- sapply(summary_data$cond2, pmatch, LETTERS) 

mypanel <- function(x, y, ..., lci, uci, scond1, scond3, groups, type, lty){ 
pnl = panel.number() 
panel.xyplot(x, y, ..., groups = groups, type = type, lty = lty) 
panel.average(x, y, horizontal = FALSE, col = "black", lwd = 3) 
panel.segments(x0 = scond1[scond3 == pnl], 
       y0 = lci[scond3 == pnl], 
       x1 = scond1[scond3 == pnl], 
       y1 = uci[scond3 == pnl]) 
} 
with(summary_data, 
stripplot(response ~ cond1 | cond2, data = raw_data, 
      groups = subject, 
      lci = lci, 
      uci = uci, 
      scond1 = summary_data$cond1, 
      scond3 = cond3, 
      type = "b", 
      lty = 2, 
      panel = mypanel) 
)