Matlab:来自自己向量的值的 3D 曲面图
Matlab: 3D Surface Plot of values from own vectors
我有 3 个坐标值为 (X,Y,Z) 的向量,我想将它们绘制为一个曲面。我已经从这里和其他论坛尝试了各种解决方案,但终究无法让它看起来像任何有意义的东西。我有一张图片可以更好地描述情况,但我不能 post 因为我没有足够的声誉。请帮忙。谢谢。
编辑:这是图片的link:
在图片中,每个矢量箭头的原点代表 3D 坐标中的点,矢量箭头的长度给出了在 3D 中移动该点所需扭矩的大小 space。
现在,数据以线向量的形式与每个点的坐标分开:一个向量代表 X,一个向量代表 Y。Z 是 3 行矩阵中的一行,因为整个矩阵描述了所需的扭矩a 3 个坐标轴。
我试过在 X 和 Y 向量上使用 meshgrid
,然后使用 griddata
和 surf
归因于 Z 值,但我没有得到看起来像原本的:
情节是线性的,但我很确定数据不是......至少不是线性的。
你似乎想绘制向量描述的单点,这里你有一个我的旧答案(作为奖励,你会有漂亮的彩色图,因为这就是最初的问题所问的):
假设 Data=[Vec1,Vec2,Vec3,...]
和 VecN=[Xn,Yn,Zn]'
”
如果要绘制点,可以定义 RGB 颜色并使用 hold on
绘制单个点,如下所示:
hold on
for i=1:length(Data(:,1))
plot3(Data(i,1),Data(i,2),Data(i,3),'Color',[(i/100*255)/255 0/255 (255-(i/100*255))/255],'LineWidth',2)
end
shg
成功解决问题。如前所述,数据不统一,因此,surf
从图的一端跳到另一端,造成一团糟。通过使用 linspace
线性组织值然后使用这些值创建 meshgrid
然后使用 griddata
和 cubic
插值分配 Z 值来解决它。管理到使用手头的数据生成外观正确的曲面图。
在循环中分别绘制每个数据点:
figure; hold on; grid on;
for i = 1:length(x)
stem3(x(i),y(i),z(i));
end
不要忘记添加 hold on
。如果绘图最初以 2D 显示,请使用图中工具栏中的 "Rotate 3D" 按钮 window。
您可以将 griddata
参数用于 natural
、cubic
或 v4
。这将进行插值并使具有 non-uniform 数据的图表平滑
下面是一个示例 MATLAb 代码
x=[32 20 67 1 98 34 57 65 24 82 47 55 8 51 13 14 18 30 37 39 10 33 21 26 38 81 83 60 95 22 17 5 72 46 99 52 12 25 96 29 70 85 43 69 19 78 97 31 89 53 2 91 48 71 61 15 36 84 94 50 11 80 6 7 49 74 9 88 40 79 27 68 73 64 63 59 86 23 35 58 45 28 100 42 93 87 16 90 41 66 54 92 77 4 62 76 75 56 3 44];
y=[96 75 24 9 83 49 27 77 3 23 17 31 40 13 7 52 51 21 98 47 64 79 78 91 44 16 15 100 84 99 63 68 70 30 54 76 97 73 33 5 88 8 71 66 62 25 60 42 72 45 18 11 28 59 89 65 10 55 69 81 12 26 20 95 87 41 74 50 93 22 43 90 14 34 82 35 56 38 80 32 1 57 6 36 37 61 29 58 2 48 4 46 67 53 92 86 94 19 39 85];
z=[55 31 11 45 83 36 86 49 15 57 42 46 8 94 88 47 54 81 98 41 32 35 56 85 9 89 37 60 23 62 67 100 78 76 73 80 10 20 68 34 77 93 1 63 53 12 22 99 91 40 84 24 33 3 43 19 92 97 6 82 64 25 26 79 95 4 44 58 5 21 70 29 65 87 96 90 51 14 18 2 72 28 71 39 52 7 27 59 50 61 48 30 66 69 17 13 74 16 75 38];
xlin = linspace(min(x), max(x), 100);
ylin = linspace(min(y), max(y), 100);
[X,Y] = meshgrid(xlin, ylin);
% Z = griddata(x,y,z,X,Y,'natural');
% Z = griddata(x,y,z,X,Y,'cubic');
Z = griddata(x,y,z,X,Y,'v4');
mesh(X,Y,Z)
axis tight; hold on
plot3(x,y,z,'.','MarkerSize',15)
我有 3 个坐标值为 (X,Y,Z) 的向量,我想将它们绘制为一个曲面。我已经从这里和其他论坛尝试了各种解决方案,但终究无法让它看起来像任何有意义的东西。我有一张图片可以更好地描述情况,但我不能 post 因为我没有足够的声誉。请帮忙。谢谢。
编辑:这是图片的link:
在图片中,每个矢量箭头的原点代表 3D 坐标中的点,矢量箭头的长度给出了在 3D 中移动该点所需扭矩的大小 space。
现在,数据以线向量的形式与每个点的坐标分开:一个向量代表 X,一个向量代表 Y。Z 是 3 行矩阵中的一行,因为整个矩阵描述了所需的扭矩a 3 个坐标轴。
我试过在 X 和 Y 向量上使用 meshgrid
,然后使用 griddata
和 surf
归因于 Z 值,但我没有得到看起来像原本的:
情节是线性的,但我很确定数据不是......至少不是线性的。
你似乎想绘制向量描述的单点,这里你有一个我的旧答案(作为奖励,你会有漂亮的彩色图,因为这就是最初的问题所问的):
假设 Data=[Vec1,Vec2,Vec3,...]
和 VecN=[Xn,Yn,Zn]'
”
如果要绘制点,可以定义 RGB 颜色并使用 hold on
绘制单个点,如下所示:
hold on
for i=1:length(Data(:,1))
plot3(Data(i,1),Data(i,2),Data(i,3),'Color',[(i/100*255)/255 0/255 (255-(i/100*255))/255],'LineWidth',2)
end
shg
成功解决问题。如前所述,数据不统一,因此,surf
从图的一端跳到另一端,造成一团糟。通过使用 linspace
线性组织值然后使用这些值创建 meshgrid
然后使用 griddata
和 cubic
插值分配 Z 值来解决它。管理到使用手头的数据生成外观正确的曲面图。
在循环中分别绘制每个数据点:
figure; hold on; grid on;
for i = 1:length(x)
stem3(x(i),y(i),z(i));
end
不要忘记添加 hold on
。如果绘图最初以 2D 显示,请使用图中工具栏中的 "Rotate 3D" 按钮 window。
您可以将 griddata
参数用于 natural
、cubic
或 v4
。这将进行插值并使具有 non-uniform 数据的图表平滑
下面是一个示例 MATLAb 代码
x=[32 20 67 1 98 34 57 65 24 82 47 55 8 51 13 14 18 30 37 39 10 33 21 26 38 81 83 60 95 22 17 5 72 46 99 52 12 25 96 29 70 85 43 69 19 78 97 31 89 53 2 91 48 71 61 15 36 84 94 50 11 80 6 7 49 74 9 88 40 79 27 68 73 64 63 59 86 23 35 58 45 28 100 42 93 87 16 90 41 66 54 92 77 4 62 76 75 56 3 44];
y=[96 75 24 9 83 49 27 77 3 23 17 31 40 13 7 52 51 21 98 47 64 79 78 91 44 16 15 100 84 99 63 68 70 30 54 76 97 73 33 5 88 8 71 66 62 25 60 42 72 45 18 11 28 59 89 65 10 55 69 81 12 26 20 95 87 41 74 50 93 22 43 90 14 34 82 35 56 38 80 32 1 57 6 36 37 61 29 58 2 48 4 46 67 53 92 86 94 19 39 85];
z=[55 31 11 45 83 36 86 49 15 57 42 46 8 94 88 47 54 81 98 41 32 35 56 85 9 89 37 60 23 62 67 100 78 76 73 80 10 20 68 34 77 93 1 63 53 12 22 99 91 40 84 24 33 3 43 19 92 97 6 82 64 25 26 79 95 4 44 58 5 21 70 29 65 87 96 90 51 14 18 2 72 28 71 39 52 7 27 59 50 61 48 30 66 69 17 13 74 16 75 38];
xlin = linspace(min(x), max(x), 100);
ylin = linspace(min(y), max(y), 100);
[X,Y] = meshgrid(xlin, ylin);
% Z = griddata(x,y,z,X,Y,'natural');
% Z = griddata(x,y,z,X,Y,'cubic');
Z = griddata(x,y,z,X,Y,'v4');
mesh(X,Y,Z)
axis tight; hold on
plot3(x,y,z,'.','MarkerSize',15)