绘制曲线集的“平均”曲线

时间:2013-05-26 21:44:57

标签: r matlab

我有一组n条曲线,即这些n条曲线中每条曲线的点(x,y)。我试图绘制“合成曲线”或平均曲线。即,取每个x的'n'y coords的平均值并绘制结果。问题是n曲线的xs不相同。我知道我可能需要内插或其他东西,但我找不到在线进行插补的例行程序。有没有人知道某人的r包或者Matlab代码或C或C ++代码?如果没有,任何想法如何以巧妙的方式进行插值?谢谢!

3 个答案:

答案 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))

enter image description here

答案 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               

enter image description here

答案 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

相关问题