我有 n 条曲线的集合,即这些 n 条曲线中每条曲线的点 (x,y)。我正在尝试绘制“结果曲线”或平均曲线。即,取每个 x 的 'n' y 坐标的平均值并绘制结果。问题是 n 条曲线的 xs 不一样。我知道我可能需要进行插值或其他操作,但我无法在网上找到一个例程。有谁知道某人为此实现的 r 包或 Matlab 代码或 C 或 C++ 代码?如果没有,任何想法如何以巧妙的方式进行插值?谢谢!!
问问题
5052 次
3 回答
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))
于 2013-05-26T22:20:44.097 回答
2
如果您curve
在 R 中使用该函数,则可以将曲线的值分配给列表(使用 <-)。这使您可以在之后平均您的曲线。
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
于 2013-05-26T22:32:25.267 回答
1
Matlab 解决方案使用interp1
:
% 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
功能将来会有所改变。
于 2013-05-26T22:16:20.657 回答