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

时间:2013-11-21 16:12:21

标签: r plot label lattice

使用panel.textltext参数非常清楚How to label panels in 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

上面板获得正确的标签(“不太可能”和“可能”),但下面板只会获得上面板标签的副本。相反,我想在下面板中绘制剩余的标签(“简单”,“困难”),但与上面板位于相同的位置。

我知道我可以使用ltext参数为每个标签分别定义每个标签,但考虑到我的“真实”情节(heh)有更多的面板和更多不同的独特标签,这是非常不切实际的解决方案。有什么建议?莱迪思只是请。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我认为你正在寻找subscripts论点:

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

答案 2 :(得分:0)

我没有足够的声誉来评论,但我想为那些使用POSIXct日期的人添加一个小的调整,以建立@ 42-。注意:我不是开发人员,编码人员或声称这将适用于每个数据集/用户 - 这只是我需要的黑客。

如果在x轴上使用日期时需要向多个绘图添加文本,则必须将as.POSIXct函数添加到指示文本位置的指定日期。我还包括panel.xyplot来演示,因为您必须指定您正在使用的绘图类型。在示例中,我在每个面板上放置了两个标签(在OP示例中预先指定)在同一y的两个面板上。

示例:

panel = function(x, y,...) {
     panel.xyplot(x, y,...)
     if(packet.number()==YOUR 1ST PANEL){ ltext(c(as.POSIXct("YOUR 1ST DATE"), as.POSIXct("YOUR 2ND DATE")), YOUR Y VALUE, labels = YOUR LABELS)}
     if(packet.number()==YOUR 2ND PANEL){ ltext(c(as.POSIXct("YOUR 1ST DATE"), as.POSIXct("YOUR 2ND DATE")), YOUR Y VALUE, labels = YOUR LABELS)}
})

希望这对某人有用。欢呼声。