在MATLAB中将plot3变成冲浪

时间:2018-01-17 12:02:59

标签: matlab plot

我有几个csv文件,我使用plot3绘制它们来创建以下图像:

first attempt

现在我想把它变成一个曲面图,因为我想根据高度为情节着色。我使用scatter3进行了以下操作:

clearvars;
files = dir('*.csv');
name = '\epsilon_{y} over time for Vertical section';
des_col_1 = 'Vertical section.epsY []';
des_col_2 = 'Length [mm]';
set(gca,'FontSize',20)
a = gca;
ii = 1;
x_data = [];
y_data = [];
z_data = [];
tStart = tic;
for file = files'
    csv = xlsread(file.name);
    [n,s,r] = xlsread(file.name);
    des_cols = {des_col_1,des_col_2};
    colhdrs = s(1,:);
    [~,ia] = intersect(colhdrs, des_cols);
    colnrs = flipud(ia);
    file.name = n(:,colnrs);
    file.name = file.name(1:end,:);
    x_data = [x_data; file.name(:,2)];
    y_data = [y_data; ones(size(file.name(:,2))).*ii];
    z_data = [z_data; file.name(:,1)];
    ii = ii+1;
end
tEnd = toc(tStart);
fprintf('%d minutes and %f seconds\n',floor(tEnd/60),rem(tEnd,60));
view(40,40);
zlabel({'True strain (%)'});
xlabel({'Length along sample (mm)'});
ylabel({'Stage'});
title({name});
scatter3(a,x_data,y_data,z_data,10,z_data);
colormap(jet); %# or other colormap

给了我这个

second attempt

这是使用比第一个更小的数据集作为测试。它几乎完全符合我的要求,但我想知道是否有办法从我的所有数据生成真正的3D表面。我可以为所有点创建一个包含x,y和z值的矩阵,我尝试用

替换scatter3(a,x_data,y_data,z_data,10,z_data);
[X,Y] = meshgrid(x_data,y_data);
f = scatteredInterpolant(x_data,y_data,z_data);
Z = f(X,Y);
surf(a,X,Y,Z);

但我得到的情节看起来不太好

third attempt

我非常确定插值有问题,但我对表面不太好,所以我不知道如何纠正它。

1 个答案:

答案 0 :(得分:2)

surf给你错误的原因是你要创建长nx1数组其中n =每个文件的点数乘以文件数。对于x,y和& z_data,你需要将它们变成矩阵。因此,请尝试以下更改:

for file = files'
    <snipped out for length>
    x_data = [x_data; file.name(:,2).'];
    y_data = [y_data; ones(1,numel(file.name(:,2))).*ii];
    z_data = [z_data; file.name(:,1).'];
    ii = ii+1;
end

这应该使x,y和z_data的大小为nxm(n =文件数,m =每个文件的数字点数)。

然后你应该能够做到

surf(x_data,y_data,z_data)