我有几个csv文件,我使用plot3绘制它们来创建以下图像:
现在我想把它变成一个曲面图,因为我想根据高度为情节着色。我使用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
给了我这个
这是使用比第一个更小的数据集作为测试。它几乎完全符合我的要求,但我想知道是否有办法从我的所有数据生成真正的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);
但我得到的情节看起来不太好
我非常确定插值有问题,但我对表面不太好,所以我不知道如何纠正它。
答案 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)