【问题标题】:Add different unique labels to each panel in lattice为 lattice 中的每个面板添加不同的唯一标签
【发布时间】:2013-11-21 16:12:21
【问题描述】:

很明显How to label panels in lattice 使用panel.textltext 参数。但是,如果我想为 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()

这段代码给了我下面的情节:

上面的面板有一个正确的标签(“不太可能”和“可能”),但下面的面板只是得到上面面板标签的副本。相反,我想在下面板中绘制剩余的标签(“easy”、“difficult”),但与上面板的位置相同。

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

【问题讨论】:

    标签: r plot label lattice


    【解决方案1】:

    (很高兴看到一个很好的格子问题。)我不同意 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()
    

    【讨论】:

    • 是的,完全正确。我有同样的想法,尽管我倾向于将每个数据包的标签放在一个列表中,以便由packet.number() 索引。如果有多个条件变量,我可能会将标签保存在 matrix(list())array(list()) 对象中,以便由 which.packet() 索引。
    • 我不确定我是否能体会到列表矩阵相对于字符元素矩阵(或数组)的优势。
    • 不确定是否有很大优势,当然如果某些数据包包含的内部标签数量不同,列表会更好。但实际上,我只是在叙述我的想法,并指出虽然我们的想法非常相似,但有一个(稍微)替代的方法。
    • 我深信不疑,特别是如果要填充更复杂的内容的小文本框。
    • 列表通常因其一般的灵活性而很好。有了它们,传入和使用标签特定的gpar 指令也不会太多工作,只是举一个例子。
    【解决方案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])
            })
    

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 2020-09-17
      • 2014-12-06
      相关资源
      最近更新 更多