【问题标题】:Turning a plot3 into a surf in MATLAB在 MATLAB 中将 plot3 变成 surf
【发布时间】: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 目前在我的办公室被阻止,因此我无法访问您的测试文件。

标签: matlab plot


【解决方案1】:

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)

【讨论】:

  • 我又一次欠你的。那行得通!我只需要做一个小改动:x_data = [x_data; file.name(:,2).'];`temp = one(size(file.name(:,2))).*ii;`temp = temp';y_data = [y_data; temp];z_data = [z_data; file.name(:,1).'];否则矩阵会不同尺寸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多