当前位置: 首页 > news >正文

【MATLAB绘图】三维曲面与二维映射组合图绘制,进阶教程与代码示例

文章目录

基础示例:s u r f surfsurf+ 三向等高线投影

%% 示例1:三维曲面 + XY/XZ/YZ 三方向投影clc;clear;close all;rng(0);%% 生成数据[X,Y]=meshgrid(linspace(-3,3,80));Z=peaks(X,Y);% MATLAB内置peaks函数,经典测试曲面%% 基本范围xMin=min(X(:));xMax=max(X(:));yMin=min(Y(:));yMax=max(Y(:));zMin=min(Z(:));zMax=max(Z(:));% 三个投影平面的位置zPlane=zMin-1.5;% XY底面投影位置yPlane=yMax+0.8;% XZ侧面投影位置xPlane=xMin-0.8;% YZ侧面投影位置%% 创建图窗figure('Color','w','Position',[100,100,900,700]);ax=axes;hold(ax,'on');%% 绘制三维曲面主体hSurf=surf(ax,X,Y,Z,...'EdgeColor','none',...'FaceAlpha',0.88);colormap(ax,parula);%% XY底面投影surf(ax,X,Y,zPlane*ones(size(Z)),Z,...'EdgeColor','none',...'FaceAlpha',0.85);%% XZ侧面投影% 将曲面沿Y方向投影到 y = yPlane 的侧面surf(ax,X,yPlane*ones(size(Y)),Z,Z,...'EdgeColor','none',...'FaceAlpha',0.75);%% YZ侧面投影% 将曲面沿X方向投影到 x = xPlane 的侧面surf(ax,xPlane*ones(size(X)),Y,Z,Z,...'EdgeColor','none',...'FaceAlpha',0.75);%% 叠加三向等高线投影levelNum=14;levels=linspace(zMin,zMax,levelNum);% 使用 contourc 获取二维等高线数据C=contourc(X(1,:),Y(:,1),Z,levels);k=1;whilek<size(C,2)levelValue=C(1,k);% 当前等高线对应的Z值pointNum=C(2,k);% 当前等高线点数idx=k+1:k+pointNum;xLine=C(1,idx);yLine=C(2,idx);% XY底面等高线投影plot3(ax,xLine,yLine,zPlane*ones(size(xLine)),...'k-','LineWidth',0.45);% XZ侧面等高线投影plot3(ax,xLine,yPlane*ones(size(xLine)),levelValue*ones(size(xLine)),...'k-','LineWidth',0.45);% YZ侧面等高线投影plot3(ax,xPlane*ones(size(yLine)),yLine,levelValue*ones(size(yLine)),...'k-','LineWidth',0.45);k=k+pointNum+1;end%% 光照设置lighting gouraud;material([0.3,0.7,0.4,10,0.3]);light('Position',[3,-3,6],'Style','infinite');%% 坐标轴与外观colorbar('Location','eastoutside');xlabel('X 轴','FontSize',11,'FontWeight','bold');ylabel('Y 轴','FontSize',11,'FontWeight','bold');zlabel('Z 值','FontSize',11,'FontWeight','bold');title('三维曲面 + 三向等高线投影',...'FontSize',13,...'FontWeight','bold');view([-38,28]);xlim([xPlane,xMax]);ylim([yMin,yPlane]);zlim([zPlane,zMax]);grid on;box on;set(ax,...'FontSize',10,...'LineWidth',1.0,...'GridAlpha',0.25,...'Projection','perspective');%% 添加说明文字text(xMax,yPlane,zMax,'XZ投影',...'FontSize',10,...'FontWeight','bold',...'HorizontalAlignment','right');text(xPlane,yMin,zMax,'YZ投影',...'FontSize',10,...'FontWeight','bold');text(xMax,yMin,zPlane,'XY投影',...'FontSize',10,...'FontWeight','bold');

关键函数速查:

功能函数 / 参数
底面投影contourf(..., 'ZLocation', zMin)
侧面投影contour(..., 'YLocation', yMax)
去除网格线surf(..., 'EdgeColor', 'none')
透明度surf(..., 'FaceAlpha', 0.85)
光照模型lighting gouraud+light(...)

进阶示例:剖面切割 + 自定义配色

%% 示例2:三维曲面 + 剖面线切割 + 渐变配色clc;clear;close all;rng(0);[X,Y]=meshgrid(linspace(-4,4,100));Z=sin(sqrt(X.^2+Y.^2))./(sqrt(X.^2+Y.^2)+0.5);% 径向sinc函数figure('Color','w','Position',[100,80,1000,720]);% --- ① 主曲面 ---ax=axes('Position',[0.08,0.12,0.78,0.80]);hold on;hSurf=surf(X,Y,Z);hSurf.EdgeColor='none';hSurf.FaceAlpha=0.82;% 自定义颜色映射:蓝→绿→黄→红nColors=256;cmap=[linspace(0.0,0.9,nColors)',...linspace(0.4,0.9,nColors)',...linspace(0.9,0.1,nColors)'];colormap(ax,cmap);% --- ② 底面等高线(填充) ---zFloor=min(Z(:))-0.15;[~,hC]=contourf(X,Y,Z,20,'ZLocation',zFloor);hC.LineColor='none';% --- ③ X=0 和 Y=0 两个剖切平面 ---% X=0 剖面xSlice=0;[~,ix]=min(abs(X(1,:)-xSlice));zSlice_x=Z(:,ix);ySlice=Y(:,ix);fill3(xSlice*ones(size(ySlice)),ySlice,zSlice_x,...zSlice_x,'EdgeColor','none','FaceAlpha',0.6);% 着色剖面% 剖面轮廓线(白色加粗)plot3(xSlice*ones(size(ySlice)),ySlice,zSlice_x,...'w-','LineWidth',1.8);% Y=0 剖面ySlice2=0;[~,iy]=min(abs(Y(:,1)-ySlice2));zSlice_y=Z(iy,:);xSlice_v=X(iy,:);fill3(xSlice_v,ySlice2*ones(size(xSlice_v)),zSlice_y,...zSlice_y,'EdgeColor','none','FaceAlpha',0.6);plot3(xSlice_v,ySlice2*ones(size(xSlice_v)),zSlice_y,...'w-','LineWidth',1.8);% --- ④ 光照 ---lighting phong;material([0.25,0.75,0.5,12,0.2]);light('Position',[5,5,10]);light('Position',[-5,-5,5],'Color',[0.4,0.4,0.6]);% 补光% --- ⑤ 外观 ---cb=colorbar('Location','eastoutside');cb.Label.String='Z 值';cb.Label.FontSize=10;xlabel('X','FontSize',11);ylabel('Y','FontSize',11);zlabel('Z','FontSize',11);title('径向 sinc 曲面 + 剖面切割','FontSize',13,'FontWeight','bold');view([-42,32]);axis tight;xlim([-4.5,4.5]);ylim([-4.5,4.5]);grid on;

高级示例:2×2 多子图组合

%% 示例3:同一数据,四种视角/映射方式并列clc;clear;close all;rng(0);[X,Y]=meshgrid(linspace(-3,3,70));Z=peaks(X,Y);zMin=min(Z(:));zMax=max(Z(:));figure('Color','w','Position',[80,60,1100,850]);tl=tiledlayout(2,2,'TileSpacing','compact','Padding','compact');title(tl,'三维曲面多角度映射组合','FontSize',14,'FontWeight','bold');% ---------- 子图①:经典斜视图 ----------ax1=nexttile;surf(X,Y,Z,'EdgeColor','none');hold on;contourf(X,Y,Z,16,'ZLocation',zMin-1.2);colormap(ax1,parula);lighting gouraud;material dull;light('Position',[3,-3,5]);view(-40,30);axis tight;grid on;title('① 斜视图 + 底面投影','FontSize',10);% ---------- 子图②:俯视图(纯等高线映射) ----------ax2=nexttile;contourf(X,Y,Z,24);colormap(ax2,cool);colorbar;axis equal tight;title('② 俯视等高线图(XY 映射)','FontSize',10);xlabel('X');ylabel('Y');% ---------- 子图③:透明曲面 + 等值面示意 ----------ax3=nexttile;hS=surf(X,Y,Z);hS.EdgeColor='none';hS.FaceAlpha=0.55;% 半透明曲面,可透视内部colormap(ax3,turbo);hold on;% 叠加网格线(稀疏,用于透视参考)hS2=surf(X(1:4:end,1:4:end),Y(1:4:end,1:4:end),Z(1:4:end,1:4:end));hS2.FaceAlpha=0;hS2.EdgeColor=[0.6,0.6,0.6];hS2.EdgeAlpha=0.4;lighting gouraud;light('Position',[0,0,10]);view(-50,28);axis tight;grid on;title('③ 半透明曲面 + 参考网格','FontSize',10);% ---------- 子图④:正射视图(三视图风格) ----------ax4=nexttile;surf(X,Y,Z,'EdgeColor','none');colormap(ax4,hot);hold on;% 添加三向轮廓线xMax=max(X(:));yMin=min(Y(:));contour3(X,Y,Z,20,'LineWidth',0.6,'LineColor',[0.30.30.3]);view(0,90);% 完全俯视axis tight;colorbar;title('④ 垂直俯视(带高度色彩)','FontSize',10);xlabel('X');ylabel('Y');

常见问题与技巧

① 投影与曲面重叠?
通过偏移ZLocation值让等高线低于曲面最小值即可:

contourf(X,Y,Z,'ZLocation',min(Z(:))-0.5);

② 配色与曲面脱钩?
多子图中每个axes要单独指定colormap,否则会共享最后一次设置:

colormap(ax1,parula);colormap(ax2,cool);

③ 光照没有效果?
lighting只对surf/patch对象生效,必须在light()调用之后才有效:

surf(...);lighting gouraud;% ← 先设置模型light('Position',[3,3,5]);% ← 再放光源

④ 剖面颜色与主曲面一致?
fill3的第四个参数传入Z ZZ值数组,再与主曲面共用同一colormap即可自动对齐颜色。

http://www.jsqmd.com/news/769071/

相关文章:

  • 用C语言手把手实现图的DFS遍历:邻接矩阵 vs 邻接表,哪个更适合你的项目?
  • 专业开源生物图标库Bioicons:科研可视化的终极解决方案
  • SketchUp STL插件终极指南:如何轻松实现3D打印格式转换
  • 装修水电阶段,除了插座和网线,这3个智能家居电位最容易漏掉(附清单)
  • AISMM零售落地三阶跃迁模型:从L1规则引擎→L2动态知识图谱→L3自主策略生成(附2026准入评估矩阵)
  • 如何用KH Coder实现零代码文本挖掘:面向普通用户的完整指南
  • 4.30日笔记(下)
  • 《FileCodeBox:开箱即取的文件分享工具,无需注册,口令直取》
  • 基于Python与JSON的个人技能量化追踪系统设计与实现
  • YOLO11涨点优化:损失函数优化 | 引入MPDIoU,利用边界框左上角和右下角距离,彻底解决重叠框匹配失效问题
  • GNOME Shell扩展vscode-workspaces:一键直达VSCode项目的效率利器
  • 5分钟从Figma到After Effects:AEUX免费终极转换指南
  • IwaraDownloadTool:终极Iwara视频批量下载解决方案
  • 从‘可用内存’到‘真实可用’:彻底搞懂Linux free命令里的buffers/cache(Ubuntu 22.04实测)
  • 3步解锁B站缓存视频:m4s-converter让珍贵内容永不丢失
  • 基于OpenAI API的智能翻译工具:架构解析与实战应用
  • 从仿真到真机:手把手教你用Jetson Orin-NX + Pixhawk 6C跑通ego-planner无人机自主飞行
  • 告别玄学调试:手把手教你用Android Studio断点追踪SIM卡加载(从RIL事件到UI显示)
  • QueryExcel:高效批量查询Excel文件内容的终极解决方案
  • AI写论文测评!这4款AI论文生成工具,究竟谁能脱颖而出?
  • 2026 高性价比电磁流量计品牌排名推荐 - 陈工日常
  • 为什么你的Windows播放器卡顿?LAV Filters免费解码方案5分钟搞定
  • Taotoken 模型广场在对比选择合适大模型时的实际使用体验
  • Python表白程序实战:用Turtle库画动态爱心与小人(含源码可修改)
  • 2026年4月市场做得好的电炉坩埚直销厂家推荐分析,碳化硅坩埚/焦碳炉坩埚/熔铝石墨坩埚/坩埚,电炉坩埚供应商找哪家 - 品牌推荐师
  • KH Coder终极指南:3分钟掌握零代码文本分析的秘密武器
  • VS Code插件开发实战:一键复制代码引用提升团队协作效率
  • 5分钟掌握Bili2Text:将B站视频智能转化为结构化文字稿
  • YOLO11涨点优化:Loss魔改 | NWD (Normalized Wasserstein Distance) 损失接入,专为Tiny微小目标检测量身定制
  • 从零构建现代化Web框架:Node.js+TypeScript实战解析