4

我有一个数据集,其中值 ( mean) 可以或不能落在 and 给出的区间lower.boundupper.bound。我想用它来绘制它lattice并且已经取得了一些非常好的东西,但是仍然缺少三件事,我不知道如何解决(我对 比较陌生lattice)。

df <- read.table("http://pastebin.com/raw.php?i=FQh6F12t")

require(lattice)
lattice.options(default.theme = standard.theme(color = FALSE))

head(df)
##    code topic problem mean lower.bound upper.bound consistent
## 7  A04C  coke      MP 99.5       36.45       95.95          0
## 8  A04C  coke      MT 47.5       22.78      100.00          1
## 11 A04C  girl      MP 50.0        4.75        9.75          0
## 12 A04C  girl      MT 99.5       20.00      100.00          1
## 23 A14G  coke      MP 88.5       21.25       66.75          0
## 24 A14G  coke      MT 82.5       48.36      100.00          1    

dotplot(lower.bound + mean + upper.bound ~ code | problem * topic, 
       data = df, pch = c(6, 3, 2), scales = list(x = list(draw = FALSE)),
       as.table = TRUE)

这会产生: 在此处输入图像描述

向下箭头/三角形表示下限,向上箭头/三角形表示上限,+标记mean. 我想添加以下内容但不知道如何添加(除了显然自定义面板功能):

  1. pch基于mean值是否在区间内的条件。变量consistent表明了这一点(0 = 在区间之外)。pch应该1用于区间内3的值和区间外的值。(下限和上限的 pch 应保持不变)
  2. 标记间隔。我想在每个 x 轴刻度之间画一条更粗的lower.bound线。upper.bound
  3. 将区间外的值比例添加到面板标题(例如,MP; 58.6%添加到左上角的面板)。

对于 1 和 2,我的问题显然是,当有多个 y 变量时,我不知道如何处理自定义面板函数(即,如何基于此编写条件面板函数)。但我在上面找不到任何东西。

对于 3,区间外的值的比例由以下内容给出:

1 - with(df, tapply(consistent, list(topic, problem), mean))
##          MP     MT
## coke 0.5862 0.1724
## girl 0.8276 0.1724

如果答案还包括一个很好的 x 轴上的级别排序,那肯定是一个加号。每个面板中的顺序可以改变(即,即使在彼此上方的面板中,相同的 x 轴刻度也可以对应于不同级别的code)。但这并不重要。

4

1 回答 1

3

好吧,这不是很漂亮,但它应该可以完成真正的工作(向您展示如何使这种情节发挥作用)。

基本思想是重写公式,使其 LHS 上没有一堆名称(即lower.bound + mean + upper.bound)。该语法等同于指定一个groups=术语,最终会触发panel.superpose()以您想要的方式进行自定义的一种痛苦。

相反,我只是mean在 LHS 上包含,然后使用subscripts自定义面板功能内部来挑选每种情况下的匹配元素upper.boundlower.bound

我希望其余的都是不言自明的:

LABS <- LETTERS[1:4]
with(df,
     dotplot(mean ~ code | problem * topic,
             lb=lower.bound, ub=upper.bound, mpch = c(3,1)[consistent+1],
             ylim = extendrange(c(0,100)),
             panel = function(x, y, lb, ub, mpch, ..., subscripts) {
                 panel.dotplot(x, y, ..., pch=mpch[subscripts])
                 lpoints(x, lb[subscripts], pch=6)
                 lpoints(x, ub[subscripts], pch=2)
                 lsegments(x,lb[subscripts],x,ub[subscripts],col="grey60")
                 ltext(x=x[3], y=95, LABS[panel.number()], col="red",fontface=2)
             },
             scales = list(x = list(draw = FALSE)), as.table = TRUE)
     )

在此处输入图像描述

于 2013-05-16T01:35:27.293 回答