晶格中面板的条件层

时间:2016-02-12 02:42:06

标签: r lattice trellis

我想在格子stripplot中用两个面板绘制两个不同条件的个别主题方法。我还想添加我已计算并存储在单独数据框中的主体内置信区间。我试图用latticeExtra的layer函数覆盖这些置信区间。当我添加图层时,两个面板上都显示两组间隔(如下面的代码和第一张图片所示),或者如果我将[subscripts]添加到x和y中,则两组间隔仅显示在第一个面板上layer命令(如下面的第二个代码片段和图片所示)。如何在适当的面板上显示相应的间隔?

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

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是metastore_db stripplot(例如,在print或任何其他图形设备内),然后使用png修改每个子面板。

trellis.focus

enter image description here

另一个(可能更方便)解决方案是创建单独的## 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() } 并设置传递给xyplot的低y值和高y值(y0y1)手动依赖于当前panel.segments。与使用panel.number的初始方法相比,这样创建的绘图可以存储在变量中,因此可用于R中的后续处理。

trellis.focus

答案 1 :(得分:0)

另一种不需要latticeExtra的解决方案(来自Duncan Mackay):

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)
)
相关问题