我正在做一个相当简单的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)
)
)
我想从“狗”面板中移除平滑线,同时保留其他所有内容,我将如何使用自定义面板功能来实现这一目标?我是否仍然可以保留我希望应用于自定义面板功能之外的每个面板的参数?
答案 0 :(得分:0)
假设我换掉了东西,那么你实际上就有了#34;狗&#34;面板,这里是如何有条件地更改面板功能
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)
)
这导致
答案 1 :(得分:0)
如果通过为组提供不同的大小来使任务变得更加困难,则可以使绘图以组大小为条件:
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)
)
)