You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改MATLAB代码将多CSV生成的2D图堆叠为3D图?

没问题,我来帮你把这些2D应力应变曲线转换成3D可视化。核心思路就是把每个CSV对应的曲线放在3D空间的不同z平面上,z轴用文件在files数组里的索引值。下面是修改后的完整代码,我会逐段解释关键变化:

修改后的MATLAB代码(直接绘制3D曲线)
clearvars;
files = dir('*.csv');
name = 'E_1';
set(groot, 'DefaultLegendInterpreter', 'none')
set(gca,'FontSize',20)
hold on;

numFiles = length(files); % 获取文件总数,用于z轴索引

for k = 1:numFiles % 用索引k循环,直接作为z轴坐标值
    file = files(k);
    [n,s,r] = xlsread(file.name); % 读取数据与表头
    des_cols = {'Stress','Ext.1(Strain)'};
    colhdrs = s(2,:);
    [~,ia] = intersect(colhdrs, des_cols);
    colnrs = flipud(ia);
    data = n(:, colnrs); % 替换原代码的变量名冲突,避免覆盖file.name
    data = data(1:end-500,:); % 保留原数据截断逻辑
    
    % 绘制3D曲线:x=应变,y=应力,z=当前文件索引k
    plot3(data(:,2), data(:,1), k*ones(size(data(:,2))), 'DisplayName', s{1,1});
end

ylabel('Stress (MPa)');
xlabel('Strain (%)');
zlabel('File Index'); % 添加z轴标签
title(name);
legend('show');
view(3); % 切换到3D视角,也可以用view([45 30])自定义角度
grid on; % 显示网格,增强3D空间辨识度

关键修改点说明

  1. 用循环索引作为z轴值:把原来的for file = files'改成for k = 1:numFiles,这样k就是每个文件在数组中的位置,直接作为该曲线的z坐标,让每条2D曲线落在3D空间的不同高度平面上。
  2. 修正变量名冲突:原代码里用file.name = ...覆盖了文件名字符串,改成data = ...更清晰,避免潜在bug。
  3. plot3的核心用法:第三个参数k*ones(size(data(:,2)))让当前曲线的所有点都固定在z=k的平面上,完美实现把多条2D曲线“堆叠”成3D效果。
  4. 3D视图优化:添加view(3)强制切换到3D视角,grid on帮助你更清楚地分辨不同z平面的曲线。

可选:用矩阵方式(xMat/yMat/zMat)实现

如果后续需要对所有数据做批量处理(比如曲面拟合),可以先把所有数据存入矩阵再绘制,适合数据长度统一的场景:

clearvars;
files = dir('*.csv');
name = 'E_1';
set(groot, 'DefaultLegendInterpreter', 'none')

numFiles = length(files);
% 先读取第一个文件确定统一的数据长度
[first_n,first_s,~] = xlsread(files(1).name);
des_cols = {'Stress','Ext.1(Strain)'};
colhdrs = first_s(2,:);
[~,ia] = intersect(colhdrs, des_cols);
colnrs = flipud(ia);
first_data = first_n(:, colnrs);
dataLength = size(first_data(1:end-500,:),1);

% 初始化三个矩阵:每列对应一个文件的数据
xMat = zeros(dataLength, numFiles); % 应变数据
yMat = zeros(dataLength, numFiles); % 应力数据
zMat = ones(dataLength, numFiles);  % z轴索引

for k = 1:numFiles
    file = files(k);
    [n,s,~] = xlsread(file.name);
    data = n(:, colnrs);
    data = data(1:end-500,:);
    % 将数据存入对应列
    xMat(:,k) = data(:,2);
    yMat(:,k) = data(:,1);
    zMat(:,k) = k;
end

% 绘制所有3D曲线
figure;
set(gca,'FontSize',20)
hold on;
for k = 1:numFiles
    plot3(xMat(:,k), yMat(:,k), zMat(:,k), 'DisplayName', s{1,1});
end

ylabel('Stress (MPa)');
xlabel('Strain (%)');
zlabel('File Index');
title(name);
legend('show');
view(3);
grid on;

注意事项

如果不同CSV文件的数据点数量不一致,建议统一长度:比如取所有文件中最小的长度来截断,或者用插值补全缺失的点,避免矩阵初始化出错。如果只是单纯绘制曲线,第一种循环plot3的方式更灵活,不需要统一数据长度。

内容的提问来源于stack exchange,提问作者enea19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:16:30