相关文章推荐
谦逊的帽子  ·  徐冬冬 - 抖音百科·  1 年前    · 
doctor_what 2023-03-06 20:29 采纳率: 100%
浏览 44
已结题

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

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

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

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

  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来画图,但是由于不知道选啥函数合适,还在试,也不知道这样处理数据会失真多少。

0

  • 编辑 收藏 删除
  • 追加酬金 (90%的用户在追加酬金后获得了解决方案)

    当前问题酬金

    ¥ 15 (您已提供 ¥ 20, 还可追加 ¥

    支付方式

    扫码支付

    加载中...

    提供问题酬金的用户不参与问题酬金结算和分配

    支付即为同意 《付费问题酬金结算规则》

    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函数来绘制三维曲线图,可以根据需要进行调整,例如改变曲面的等值线值、曲面的颜色等等。

      本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?
      按下Enter换行,Ctrl+Enter发表内容
    • dahe0825 2023-03-06 20:55
      关注

      参考GPT的回答内容和自己的思路,您可以使用Matlab的surf函数来画三维曲线图。以下是基于您提供的数据和代码的一个示例:

      data = sortrows(data); % data就是原始数据,由x1,y1,z1,f1四组列向量构成
      x1 = data(:,1);
      y1 = data(:,2);
      z1 = data(:,3);
      f1 = data(:,4);
      % 定义插值网格
      x2 = (-0.17):0.01:(-0.12);
      y2 = (-0.01):0.01:(0.01);
      z2 = 3.99:0.01:4.01;
      [X,Y,Z] = meshgrid(x2,y2,z2);
      % 用插值函数插值
      F = griddata(x1,y1,z1,f1,X,Y,Z,'linear');
      figure;
      surf(X,Y,Z,F);
      xlabel('X');
      ylabel('Y');
      zlabel('Z');
      

      在这个示例中,选择了线性插值函数。请注意,您可以选择其他插值函数来更好地适应您的数据。另外,请注意,此示例中的网格大小可能需要根据您的数据进行调整。
      回答不易,还请采纳!!!

      本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?
      按下Enter换行,Ctrl+Enter发表内容
  • 「已注销」 2023-03-06 21:00
    关注

    参考GPT和自己的思路,你的想法是正确的,可以使用插值和网格化来生成一个新的网格数据,然后使用合适的函数来绘制图形。在这里,你可以尝试使用Matlab自带的函数,比如surf、scatter3、slice、isosurface等等。以下是一些示例代码,你可以根据自己的需要进行修改。

    1 使用surf函数绘制曲面图

    figure;
    surf(X,Y,Z,F);
    colorbar;
    xlabel('x');
    ylabel('y');
    zlabel('z');
    title('Surface Plot');
    

    2 使用scatter3函数绘制散点图

    figure;
    scatter3(X(:),Y(:),Z(:),20,F(:),'filled');
    colorbar;
    xlabel('x');
    ylabel('y');
    zlabel('z');
    title('Scatter Plot');
    
    figure;
    slice(X,Y,Z,F,[],[],z2);
    colorbar;
    xlabel('x');
    ylabel('y');
    zlabel('z');
    title('Slice Plot');
    

    4 使用isosurface函数绘制等值面图

    figure;
    isosurface(X,Y,Z,F,0.5);
    axis tight;
    daspect([1,1,1]);
    camlight;
    colorbar;
    xlabel('x');
    ylabel('y');
    zlabel('z');
    title('Isosurface Plot');
    

    以上这些函数都可以用来绘制三维曲面图形,可以根据你的需求选择合适的函数进行使用。插值和网格化过程中可能会有一些误差,但可以尝试使用不同的插值方法,如'nearest'、'linear'、'cubic'等来比较误差的大小。

    本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?
    按下Enter换行,Ctrl+Enter发表内容
  • A1358722560 2023-03-06 21:20
    关注

    根据要求,设计了以下代码:

    import matplotlib.pyplot as plt
    import numpy as np
    # 生成坐标点
    x = np.linspace(0, 10, 40)
    y = np.linspace(0, 10, 40)
    z = np.linspace(0, 10, 40)
    # 生成网格
    X, Y, Z = np.meshgrid(x, y, z)
    # 颜色映射
    Color = np.sqrt(X ** 2 + Y ** 2 + Z ** 2)#可替换为你表格中的数据
    # 颜色图
    cmap = plt.get_cmap('RdBu')
    # 绘制散点图
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    sca = ax.scatter(X, Y, Z, c=Color, cmap=cmap)
    plt.colorbar(sca)
    # 显示图形
    plt.show()
    

    如果问题得到解决请点 采纳~~

    本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?
    按下Enter换行,Ctrl+Enter发表内容
  • 蓝白、波罗歌 2023-03-06 21:33
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    你的处理思路是正确的,可以先进行插值处理,再使用绘图函数进行绘制。其中,griddata函数就是用来进行插值的,可以根据指定的网格位置和原始的散点数据进行插值。绘图函数可以选择surf函数或scatter3函数。

    下面是具体的代码实现,其中选择了surf函数进行绘图:

    % 原始数据,四列散点数据x1,y1,z1,f1
    data = [x1,y1,z1,f1];
    % 选择插值网格的范围
    x2 = (-0.17):0.01:(-0.12); 
    y2 = (-0.01):0.01:(0.01);
    z2 = 3.99:0.01:4.01;
    % 对原始数据进行插值处理
    [X,Y,Z] = meshgrid(x2,y2,z2);
    F = griddata(data(:,1),data(:,2),data(:,3),data(:,4),X,Y,Z,'linear');
    % 绘制图形
    figure;
    surf(X,Y,Z,F);
    title('4D plot');
    xlabel('x');
    ylabel('y');
    zlabel('z');
    colormap(jet)
    

    这个代码中,插值使用的是线性插值方式。你可以根据数据的特点,选择合适的插值方式。surf函数可以将插值后的图形绘制成三维曲面,颜色由F值决定。注意,F值必须在一定范围内,否则会出现渲染异常,所以需要保证F值在一定范围内。

    另外,你也可以使用scatter3函数来进行绘图,代码如下:

    % 绘制图形
    figure;
    scatter3(x1,y1,z1,[],f1,'filled');
    title('4D plot');
    xlabel('x');
    ylabel('y');
    zlabel('z');
    colormap(jet)
    

    这个代码中,使用scatter3函数将点绘制成三维散点图,用颜色表示第四维数据。需要设置颜色值为空,用f1值来进行颜色映射。你可以根据数据特点选择合适的绘图方式。
    如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?
    按下Enter换行,Ctrl+Enter发表内容
  • 2023-03-07 11:47
    关注

    于绘制三维网格图形的问题,如果数据点数量太多,使用mesh等函数可能会导致图形变得非常密集,难以观察。因此,可以考虑使用其他的函数来绘制。

    一种比较常见的方法是使用isosurface函数,该函数可以根据给定的等值面值绘制三维表面。具体来说,可以先使用griddata函数对数据进行插值,再使用isosurface函数绘制等值面。

    另外,如果想要在三维图形中表示数据的颜色变化,可以使用scatter3函数绘制散点图,并根据数据的值来选择颜色。但是,由于数据点数量太多,可能会导致绘制速度较慢,因此可以考虑对数据进行采样,只选择部分数据进行绘制。

    本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?
    按下Enter换行,Ctrl+Enter发表内容
  • 查看更多回答(5条)

    报告相同问题?

    问题事件

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

    悬赏问题

    • ¥15 matlab有svec这个函数吗? 无法调用VideoWriter_fourcc VB6.0无法加载网页验证码图片到picturebox中,求解。 C#和GDAL对栅格处理 我现在有一些关于提升机故障的专有文本数据,量也不多,我在label studio上进行了关系和实体的标注,完成了知识图谱的构造,那么我使用生成式模型的话,我能做哪些工作来写我的论文? 电脑连不上无线网络如下诊断反馈应该如何操作 telegram api 使用forward_messages方法转发消息时,目标群组里面会出现此消息来源,如何隐藏? 关于#tensorflow#的问题:有没有什么方法可以让机器自己学会像素风格的图片