Построить список линий с R решетчатым пакетом
Я пытаюсь показать некоторые варианты вариограмм в верхней части xy.plots. Panel.plots работают для всех, кроме списка строк, которые я хотел добавить к соответствующим субплотам.
require(gstat)
require(sp)
data(meuse)
names(meuse)
#make directional variograms
b<-variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135))
#split the variogram data by direction
a<-lapply(1:length(unique(b$dir.hor)),
function(i) subset(b, grepl(unique(b$dir.hor)[[i]], b$dir.hor)))
#get the model fit parameters for each directional variogram
a<-lapply(1:length(unique(b$dir.hor)),
function(i) fit.variogram(a[[i]], vgm(0.5,"Exp", 1200, 0.5)))
#generate model data for the directional variograms
a<-lapply(1:length(a), function(i)
variogramLine(a[[i]], maxdist=1500))
#plot
require(lattice)
plot(b, ylim=c(0,1.2), xlim=c(0,1500), cex=1.5,
panel = function(x, y, ...) {panel.xyplot(x, y, ...)
panel.abline(v=1000, lwd=1, lty=3, col=2)
panel.lines(a[[i]], lwd=2, lty=2, col=4)
})
Последний аргумент в графике не работает, потому что это список (см. Ошибку при отображении графика), не уверен, как список линий должен быть построен с помощью решетки. Помощь будет оценена!
1 ответ
Использование packet.number()
или же panel.number()
чтобы найти личность текущей панели. Ваш пример не удался, так что я внес некоторые изменения, чтобы он работал правильно.
library(gstat)
library(sp)
data(meuse)
# make directional variograms
b <- variogram(log(zinc) ~ x + y, meuse, alpha = c(0, 45, 90, 135))
# split the variogram data by direction
a <- lapply(1:length(unique(b$dir.hor)),
function(i) subset(b, grepl(unique(b$dir.hor)[[i]], b$dir.hor)))
# get the model fit parameters for each directional variogram
a <- lapply(1:length(unique(b$dir.hor)),
function(i) fit.variogram(a[[i]], vgm(0.5, "Exp", 1200, 0.5)))
# generate model data for the directional variograms
a <- lapply(1:length(a), function(i) variogramLine(a[[i]], maxdist = 1500))
# plot
require(lattice)
plot(b, ylim = c(0, 1.2), xlim = c(0, 1500), cex = 1.5,
panel = function(x, y, ...) {
panel.xyplot(x, y, ...)
panel.abline(v = 1000, lwd = 1, lty = 3, col = 2)
panel.lines(a[[packet.number()]], lwd = 2, lty = 2, col = 4)
})