doctor_what 2023-03-06 20:29 采纳率: 100%
浏览 51
已结题

Matlab 4D绘图提问(X,Y,Z,F(颜色))

Matlab画图 现有四列散点数据x1,y1,z1,f1,想画一个如下图所示的三维曲线图

img

数据大概是这样的,100 * 100 * 100个点。站里有好多利用mesh,meshc,meshz函数绘制三维网格图形的,尝试画了一下但是行不通?用Scatter3画了一个。刚开始用,在论坛里查了好久,但是没搞明白。希望有兄弟愿意指导一下思路?

img

img

我现在的初步想法是插值、网格化,再选择合适的函数画图,代码是这样滴

  data = sortrows(data); % data就是原始数据,由x1,y1,z1,f1四组列向量构成
  x1 = data(:,1);
  y1 = data(:,2);
  z1 = data(:,3);
  f1 = data(:,4);

  x2 = (-0.17):0.001:(-0.12); 
  y2 = (-0.01):0.001:(0.01);
  z2 = 3.99:0.001:4.01;

  [X,Y,Z] = meshgrid(x2,y2,z2);
  F = griddata(x1,y1,z1,f1,X,Y,Z,'linear');

然后用新获得的这组X,Y,Z,F来画图,但是由于不知道选啥函数合适,还在试,也不知道这样处理数据会失真多少。

  • 写回答

6条回答 默认 最新

  • 「已注销」 2023-03-06 20:55
    关注

    “Devil组”引证GPT后的撰写:

    • 你的初步想法是正确的,使用插值函数griddata可以将原始散点数据转换为网格化数据,并用于绘制三维曲线图。

    以下是一个可能的实现:

    % 排序原始数据
    data = sortrows(data);
    x1 = data(:,1);
    y1 = data(:,2);
    z1 = data(:,3);
    f1 = data(:,4);
    
    % 定义插值网格
    x2 = linspace(min(x1), max(x1), 100); 
    y2 = linspace(min(y1), max(y1), 100);
    z2 = linspace(min(z1), max(z1), 100);
    [X,Y,Z] = meshgrid(x2,y2,z2);
    
    % 插值
    F = griddata(x1, y1, z1, f1, X, Y, Z, 'cubic');
    
    % 绘制三维曲线图
    figure;
    p = patch(isosurface(X, Y, Z, F, 0.5));
    set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
    daspect([1,1,1]);
    view(3);
    axis tight;
    camlight;
    lighting gouraud;
    
    
    

    假设原始数据包含了足够的样本点,可以进行插值。如果原始数据太稀疏,插值结果可能会失真,需要更多的样本点来支撑插值结果。

    这个代码用到了isosurface函数来绘制三维曲线图,可以根据需要进行调整,例如改变曲面的等值线值、曲面的颜色等等。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月6日

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了