将非线性线添加到xyplot(晶格)

时间:2015-05-11 07:56:46

标签: r plot lattice

数据集:

Distance <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15, 15 ,15, 15 ,15 ,15 ,15,15 ,15 ,20, 20 ,20, 20 ,20, 20 ,20, 20 ,20 ,20 ,20 ,20 ,20 ,20, 20 ,20, 20 ,20, 20 ,20, 20)
CHeight <- c(400,300,200,0,-200,-400,-600,-800,-1000,-1000,-1200,-1220,-1300 ,-1400,-1400,-1500,-1600,-1700,-1700,-1800,-1900,400,200,0,-200,-400,-600,-800,-1000,-1200,-1200,-1400,-1600,-1600,-1800,-2000,-2000,-2200,-2200,-2400,-2600,-2800,-3000,400,200,0,-200,-300,-400,-500,-600,-700,-800,-900,-1000,-1100,-1200,-1200,-1400,-1600,-1800,-1800,-2000,-2200,-2400,-2400,-2600,-2800,-3000,400,200,0,-200,-400,-600,-800,-1000,-1200,-1400,-1600,-1600,-1800,-2000,-2200,-2400,-2400,-2600,-2800,-3000,1000,800,600,400,200,0,-200,-400,-600,-800,-1000,-1200,-1400,-1600,-1800,-2000,-2200,-2400,-2600,-2800,-3000)
Value <- c(163301.080, 269704.110 ,334570.550, 409536.530, 433021.260 ,418962.060, 349554.460, 253987.570,124461.710, 140750.480  ,52612.790 , 54286.427  ,26150.025  ,14631.210  ,15780.244 ,  8053.618, 4402.581,   2251.137  , 2743.511 ,  1707.508 ,  1246.894 ,176232.060 ,270797.240 ,323096.710,333401.080, 311949.900 ,272821.770 ,189571.850 ,114263.560  ,51939.070  ,62578.665  ,36905.438,  22625.515,  22940.591  ,14576.295  , 9686.653 , 10344.214  , 6912.779  , 7092.919   ,5366.797, 4058.492,   3270.734  , 2528.644  ,89311.555 ,116698.175 ,143588.620 ,139203.190, 145399.445, 145635.715, 134671.110 ,128931.160 ,119734.835 ,108708.815 , 90221.955  ,81692.585 , 64882.275,58215.735,  60443.190  ,44690.690 , 33224.152 , 24140.272 , 24913.280  ,19082.689  ,13920.669, 11074.718,  10015.653   ,8743.850  , 7516.880 ,  6377.743 , 36888.842  ,43088.720  ,47904.490, 51298.710,  51120.887  ,47687.488  ,42238.912 , 38563.007 , 33902.918  ,28565.303  ,23700.862,24818.393,  21620.129 , 17816.061  ,15377.097 , 12992.321  ,12985.911  ,11177.941   ,9536.621,8357.279,  13052.178 , 14325.789  ,15120.314 , 16227.575  ,17226.307  ,18557.270  ,18680.326, 18844.544,  18205.607,  17770.311  ,16605.438 , 16062.309  ,14785.654  ,14324.493  ,13373.627,12135.392,  10632.699,   9155.762  , 8240.951,   6934.240  , 6475.927)
Factor1 <- c(0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1)
Factor2 <- c(0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1)
Factor3 <- c(0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1)

Frame=data.frame(Distance, CHeight, Value, Factor1, Factor2, Factor3)

我有一个功能

mainfunction<-function(CHeight,Distance,a,b,f,g,k){
  (a * exp(-((Height + b)/2 * g)^2) - (k * Distance)) + a * 
   exp(-((CHeight + b)/(2 * g + f * Distance))^2) * (1 - exp(-k * Distance))
}

我有一个xyplot喜欢:

library(lattice)
xyplot(Value ~ CHeight | Distance*Factor1, 
       data=Frame[Frame$Factor2==1 & Frame$Factor3==1,])

现在我想在矩阵散点图上添加一些行

lines(x, mainfunction(x,10,40000,0,1/500,1/500,0))

哪个不起作用,所以对此的任何帮助都会很棒。但在一个完美的世界里,我希望能够分开一个单独的序列。为y生成序列的值也是如此。

类似

Distance <- seq(0,20,5)

因此,简而言之,我基本上希望能够更改函数中参数的值,并直观地了解它们如何通过散点图矩阵上的线条影响数据的拟合。

1 个答案:

答案 0 :(得分:1)

mainfunction中的错字,您有Height而不是CHeight

lines无法在lattice中工作。这将使用panel.lines

绘制它们
    xyplot(Value ~ CHeight | Distance*Factor1, 
           data=Frame[Frame$Factor2==1 & Frame$Factor3==1,]
    ,panel=function(x,y,...){
         panel.xyplot(x,y,...)
         panel.lines(x, mainfunction(x,10,40000,0,1/500,1/500,0))
})

我想你需要让它们排成一行。

更新:

如果我理解你的评论,你希望每个面板中绘制的线使用Distance的适当值而不是固定值10.一种方法是使用subscripts参数来panel函数,它给出了每个面板中使用的原始数据的行号。有了它,您可以查找这些行的Distance值,并在mainfunction中使用。例如:

    xyplot(Value ~ CHeight | Distance*Factor1, 
           data=Frame[Frame$Factor2==1 & Frame$Factor3==1,]
    ,panel=function(x,y,subscripts,...){
         panel.xyplot(x,y,...)
         D =Frame[Frame$Factor2==1 & Frame$Factor3==1,]$Distance[subscripts[1]]
        panel.text(0,0,D) #diagnostic to show D for each panel
         panel.lines(x, mainfunction(x,D,40000,0,1/500,1/500,0))
})

在此,我将D设置为当前子集的Distance值,并在mainfunction中使用该值。我也将它打印出来,以显示每个面板的不同之处。这些曲线对我来说都是一样的,但是如果你将k设置为10,你会得到一些差异。