【问题标题】:Connect points with a line in only certain panels of xyplot仅在 xyplot 的某些面板中用线连接点
【发布时间】:2015-02-17 14:58:21
【问题描述】:

我正在做一个相当简单的 xyplot 点阵图,为了清楚起见,使用两个点和一条连接它们的线。但是,在我的一些面板中,数据很稀疏,我不想连接这些点。我希望能够指定哪些面板应该有一条线。我尝试过使用 par.settings 和 panel.superpose,但我一定遗漏了一些东西,因为没有什么能正常工作。当我尝试 panel.superpose 时,它​​似乎使我不在该语句中的所有其他图形设置无效。我找到了有关如何在一个面板中更改不同组的线型的答案,但我希望它们在面板之间有所不同,我很难过。

代码如下:

theme1 <-list(strip.background=list(col="gray75"))

myplot=xyplot(Average.of.response~bin|disttype, 
   groups=X_LEVEL_, 
   data=initbehav.disttype[order(initbehav.disttype$disttype),], 
   subset=initbehav=="Foraging",
   par.settings = theme1,
   ylab=list(label="Average Probability of Response Type",cex=1.1, fontface="bold"),
   xlab=list(label="Distance to Disturbance Source (m)", cex=1.2, fontface="bold"),

   key=list(text=list(
     lab=as.character(unique(initbehav.disttype$X_LEVEL_)),
     padding.text=10),
     points=list(cex=1.5, pch=c(0,16,2,18), col="black"),  
     columns=4, 
     space="bottom"),

   type=c("l","p"),
   pch=c(0,16,2,18),
   cex=1.4,
   col="black",
   scales=list(
     x=list(rot=45, cex=0.9), 
     y=list(cex=1.1)
   )

)

用示例数据编辑:

为了论证,如果这是我的代码:

group=(c("a","b","c"))

data=data.frame(
Y=runif(30,min=0, max=25),
X=rep(c("dog", "car", "person"), each=10),
Z=sample(group, 30, replace=T))

library(lattice)

xyplot(Y~X|Z, 
       data=data,
       type=c("smooth","p"),
       cex=1.4,
       col="black",
       scales=list(
         x=list(rot=45, cex=0.9), 
         y=list(cex=1.1)
       )
)

我想从“狗”面板中删除平滑线,同时保持其他所有内容不变,我将如何使用自定义面板功能来实现这一点?我还能保留我希望应用于自定义面板功能之外的每个面板的参数吗?

【问题讨论】:

  • 在这里发布一些sample data 会有所帮助。如果我们无法运行您的功能,则很难帮助您修复它。在您的示例中明确说明您想要连接哪些面板,以及您不想连接哪些面板。你肯定需要一个自定义面板功能。
  • 谢谢,我更新了简单的示例代码。
  • 在您的示例中,您有用于 a、b 和 c 的面板,而不是用于狗的面板。您的意思是 Y~Z|X 的公式吗?

标签: r plot lattice


【解决方案1】:

假设我切换了一些东西,所以你实际上有一个“狗”面板,下面是你可以有条件地改变面板功能的方法

xyplot(Y~Z|X, 
    data=data,
    type=c("smooth","p"),
    cex=1.4,
    col="black",
    panel = function(..., type) {
        grpname <- dimnames(trellis.last.object())[[1]][packet.number()]
        if(grpname == "dog") {
            panel.xyplot(..., type=setdiff(type,"smooth"))
        } else {
            panel.xyplot(..., type=type)
        }
    },
    scales=list(
        x=list(rot=45, cex=0.9), 
        y=list(cex=1.1)
    ),
    layout=c(3,1) # (optional)
)

这会导致

【讨论】:

  • 完美运行。我不会知道寻找那个 trellis.last.object 调用。谢谢!
  • 是的。不幸的是,没有更简单的方法(据我所知)来获取面板函数内的条件变量的值。如果要包含的逻辑是基于观察的数量,那么代码会更简单,就像@BondedDust 已经展示的那样。但这不是您在示例中要求的。
【解决方案2】:

如果您通过为组指定不同的大小使任务变得更难一些,您可以使绘图以组大小为条件:

 group=(c("a","b","c"))

data=data.frame(
Y=runif(30,min=0, max=25),
X=c( rep(c( "car", "person"), each=13),rep("dog", each=4)),
Z=sample(group, 30, replace=T)
)
library(lattice)
xyplot(Y~Z|X,   data=data,  cex=1.4,  col="black",
    panel = function(x, y, ...) {
           if( length(x) >5) {
            panel.xyplot(x, y, ..., type=c("p", "smooth"))
        } else {
            panel.xyplot(x, y, ..., type="p")
        }
    },
    scales=list(
        x=list(rot=45, cex=0.9), 
        y=list(cex=1.1)
             )
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-09
    • 2010-10-26
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多