2013-05-26 113 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