将非线性线添加到 xyplot(格子)
Adding Non Linear Lines to xyplot (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)
所以简而言之,我基本上希望能够更改函数中的参数值,并通过散点图矩阵上的线条直观地查看它们如何影响数据的拟合。
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,你会得到一些差异。
数据集:
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)
所以简而言之,我基本上希望能够更改函数中的参数值,并通过散点图矩阵上的线条直观地查看它们如何影响数据的拟合。
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,你会得到一些差异。