【发布时间】:2018-01-17 12:02:58
【问题描述】:
我有几个 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);
但我得到的情节看起来不太好
我很确定插值有问题,但我对表面不是很好,所以我不知道如何纠正它。
【问题讨论】:
-
每个文件中的
x_data数组是否相同?尺寸一样吗?相同的值? -
是的,它们的大小相同,但值不同。这是一些文件的链接:dropbox.com/sh/pmvl92c5xv31oiu/AADPDXmUBy3MFL7OyqzMwopIa?dl=0
-
这可能很明显,但您是否在循环完成后尝试
surf(x_data,y_data,z_data)。您不必拥有完美的 X 和 Y 网格,surf也能正常工作。根据 X 值的变化程度,表面的面可能会有些倾斜,但值得一试。 -
我试过了,我得到错误 using surf (line 71) Z must be a matrix, not a scalar or vector.
-
嗯,看你的代码很有趣,我会假设它是一个矩阵。我想我知道发生了什么并将很快提供答案。但是,我无法对其进行测试,因为 Dropbox 目前在我的办公室被阻止,因此我无法访问您的测试文件。