我有一组n条曲线,即这些n条曲线中每条曲线的点(x,y)。我试图绘制“合成曲线”或平均曲线。即,取每个x的'n'y coords的平均值并绘制结果。问题是n曲线的xs不相同。我知道我可能需要内插或其他东西,但我找不到在线进行插补的例行程序。有没有人知道某人的r包或者Matlab代码或C或C ++代码?如果没有,任何想法如何以巧妙的方式进行插值?谢谢!
答案 0 :(得分:4)
使用approx
进行线性插值的R解决方案。
首先我创建一些数据(你质疑一个可重现的例子)。 在这里,我创建一个列表,包含5个data.frame,带有不同的xs:
ll <- lapply(1:5,function(i)
data.frame(x=seq(i,length.out=10,by=i),y=rnorm(10)))
然后要应用approx
,我创建一个包含所有数据的大型data.frame:
big.df <- do.call(rbind,ll)
然后,我绘制线性近似和我的所有系列:
plot(approx(big.df$x,big.df$y),type='l')
lapply(seq_along(ll),
function(i) points(ll[[i]]$x,ll[[i]]$y,col=i))
答案 1 :(得分:2)
如果您在R中使用curve
函数,则可以将曲线的值分配给列表(使用&lt ;-)。这允许您在之后平均曲线。
x <-runif(10)
plot(x, ylim=c(-5,5))
a <-curve(sin, add=TRUE, col="red")
b <-curve(cos, add=TRUE, col="blue")
xx <-(a$x+b$x)/2 # x average
yy <-(a$y+b$y)/2 # y average
lines(xx,yy, col="purple") #draw average curve
答案 2 :(得分:1)
使用interp1
的Matlab解决方案:
% X and Y data for two curves
x1 = -1:0.11:1;
x2 = -1:0.09:1;
y1 = x1.^2;
y2 = x2.^2;
% Assemble variable length (ragged) data into cell arrays
X = {x1;x2};
Y = {y1;y2};
% Vector of interpolated x coordinates
Xq = -1:0.1:1;
% Interpolate each curve to Xq and save in row of matrix Yq
N = length(X);
Yq(N,length(Xq)) = 0;
for i = 1:N
Yq(i,:) = interp1(X{i},Y{i},Xq);
end
% Display result
figure;
plot(Xq,Yq,'.-')
您可以使用interp1
中提供的各种插值方法。如果你有R2012a或更新,请注意他interp1
函数will be changing a bit in the future。