2013-05-26 83 views
0

我有n条曲线的集合,即这n条曲线中的每一条曲线的点(x,y)。我试图绘制一条“合成曲线”或平均曲线。即,取每个x的'n'y坐标的平均值并绘制结果。问题是n个曲线的xs不一样。我知道我可能需要内插或其他东西,但是我找不到在线做的例程。有人知道某个r软件包或Matlab代码或C或C++代码是否由某人执行?如果没有,有什么想法如何以聪明的方式进行插值?谢谢!!使用interp1绘制一组曲线的“平均”曲线

+2

对于线性插值,可以使用'approx'。 –

回答

3

使用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

谢谢!这正是我想要它做的。 – user1775614

1

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

+0

谢谢!解答我的问题! – user1775614

2

如果您在R中使用curve函数,则可以将曲线的值分配给列表(使用< - )。这可以让你平均你的曲线之后。

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