为lattice中的每个面板添加不同的唯一标签

4

使用panel.textltext参数可以很清楚地如何在lattice中标记面板。但是,如果我想在lattice中为每个面板使用不同的唯一标签怎么办?让我用这个简化的Dotplot说明我的观点:

library(Hmisc)
#example data
data <- data.frame(transport=rep(c("bicycle","bus"),each=2), 
                   att=rep(c("behaviour control","intention"),2),
                   value=c(4.134,4.5,3.77,2.4), Lo=c(3.92,4.37,3.51,2.2),
                   Hi=c(4.34,4.62,4.02,2.61))
#labels I want to use
labels.hi=c("likely","easy")
labels.lo=c("unlikely","difficult")
#example dotplot
png("test.png",width=300, height=400)
Dotplot(transport ~ Cbind(value, Lo, Hi) | att, data, col=1,
        panel = function(x, y,...) {
          panel.Dotplot(x, y,...)
          ltext(2.5,1.5, labels=labels.lo)
          ltext(4.5,1.5, labels=labels.hi)
        })
dev.off()

这段代码会生成下面的图表:

enter image description here

上面的面板得到了正确的标签(“不可能”和“可能”),但下面的面板只是获得了与上面面板相同的标签副本。相反,我想在下面的面板中绘制剩余的标签(“容易”,“困难”),但位置与上面的面板相同。
我知道我可以使用每个标签的参数单独定义每个标签,但考虑到我的“现实生活”情节(嘿),这是一个相当不切实际的解决方案,因为它有更多的面板和更多不同的唯一标签。有什么建议吗?请只使用Lattice。
2个回答

3

很高兴看到一个好的格子问题。我不同意agstudy的下标会是一个好的索引策略。在这种情况下,它们之所以起作用是因为您的点与标签相同且顺序相同。下标是选择单个数据点进行面板而不是面板索引的机制。考虑使用packet.number()panel.number()函数。在这种情况下,我相信它们返回相同的值,但如果您有更复杂的条件因素,请查阅它们共享的帮助页面:

Dotplot(transport ~ Cbind(value, Lo, Hi) | att, data, col=1,
        panel = function(x, y,...) {
          panel.Dotplot(x, y,...)
          if(packet.number()==1){ ltext(c(2.5,4.5) ,1.5, labels= labels.lo)}
          if(packet.number()==2){ ltext(c(2.5,4.5) ,1.5, labels=labels.hi)}
        })

如果您的标签是在一个矩阵中,那么使用"["进行索引会很容易。

lab.mat=matrix(c( labels.hi,labels.lo), 2)
lab.mat
#     [,1]     [,2]       
#[1,] "likely" "unlikely" 
#[2,] "easy"   "difficult"

png("test.png",width=300, height=400)
Dotplot(transport ~ Cbind(value, Lo, Hi) | att, data, col=1,
        panel = function(x, y,...) {
          panel.Dotplot(x, y,...)
          { ltext(c(2.5,4.5) ,1.5, labels= lab.mat[packet.number(),])}
        })
dev.off()

enter image description here


是的,完全正确。我也有同样的想法,不过我倾向于将每个数据包的标签放在一个列表中,以便通过packet.number()进行索引。如果有多个条件变量,我可能会将标签存储在一个matrix(list())array(list())对象中,以便通过which.packet()进行索引。 - Josh O'Brien
我还不确定我是否能够欣赏矩阵列表相对于字符元素矩阵(或数组)的优势。 - IRTFM
虽然当然列表如果某些数据包在其内部标签的数量上有所不同,它们会更好,但我不确定是否有太多优势。但实际上,我只是叙述了我的想法,并指出尽管我们沿着非常相似的思路思考,但存在(稍微)不同的方法。 - Josh O'Brien
我相信,特别是如果有小文本框需要填写更复杂的内容。 - IRTFM
列表通常因其一般的灵活性而受欢迎。使用它们,传递和使用特定于标签的 gpar 指令也不需要太多的工作,这只是另一个例子。 - Josh O'Brien
之前不知道 packet.number(),谢谢你提供这个信息。每次来到这里都能学到新东西 :) 另外,矩阵方法对我来说非常完美,因为我有很多类似的标签 - 这样更容易组织。感谢 @DWin。 - Geek On Acid

2
我认为你在寻找"下标"参数:


labels=c("likely","easy","unlikely","difficult")
#example dotplot
Dotplot(transport ~ Cbind(value, Lo, Hi) | att, data, col=1,
        panel = function(x, y,subscripts,...) {
          panel.Dotplot(x, y,...)
          ltext(c(2.5,4.5),1.5, labels[subscripts])
        })

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接