从3d矢量绘制3d等高线图

时间:2015-02-09 05:59:12

标签: matlab vector plot matlab-figure contour

我想绘制三维数据的等高线图。

我在x,y,z方向有一个力我想为那个

绘制contour3

对于Fy和Fz,Fx = 21x21X21的尺寸相同

我发现force = f * vector(x,y,z) 然后

Fx(x,y,z) = force(1)
Fy(x,y,z) = force(2)
Fz(x,y,z) = force(3)

我做了以下但是它没有和我一起工作?为什么以及如何绘制

FS = sqrt(Fx.^2 + Fy.^2 + Fz.^2);

x = -10:1:10;
[X,Y] = meshgrid(x); 
for i=1:length(FS)

   for j = 1:length(FS)
       for k=1:length(FS)
        contour3(X,Y,FS(i,j,k),10)
        hold on
      end
   end
end

这是我得到的错误 使用contour3时出错(第129行) 当Z是向量时,X和Y也必须是向量。

2 个答案:

答案 0 :(得分:1)

您的问题是FS的形状与X和Y的形状不同。

让我们用一个简单的例子说明:

X=[1 1 1
   2 2 2
   3 3 3];
Y=[1 2 3
   1 2 3
   1 2 3];
Z=[ 2 4 5 1 2 5 5 1 2];

您的数据可能是这样的。 Matlab如何知道哪个Z条目对应哪个X,Y位置?他没有,这就是他告诉你When Z is a vector, X and Y must also be vectors的原因。

您可以通过执行reshape(FS,size(X,1),size(X,2))解决此问题,并且可能适用于您的情况,但您需要小心。在您的示例中,XY似乎与FS无法以编程方式相关。要获得有意义的等高线图,您需要确保FS(ii,jj,k) [1]对应于X(ii,jj),否则您的等高线图将没有意义。

通常,您希望将FS的结果与您用来计算它的变量进行对比,例如iijjk,但是,我不知道这些是什么样的,所以我会在这里停止解释。

[1]:DO NOT CALL VARIABLES i and j IN MATLAB!

答案 1 :(得分:1)

我不确定这个解决方案是否符合您的要求。

您的问题是contourcontour3是用于表示2D对象中的标量字段的图。请注意,球是2D物体 - 每个点都由角度theta和phi定义 - 即使它是"空间"不在"飞机"。

对于矢量字段的表示,有quiverquiver3streamslicestreamline函数。

如果要使用等高线图,则必须将数据从矢量场转换为标量场。因此,您的 F = f(x,y,z)形式的数据必须转换为H = f(x,y)的形式。在那种情况下,H是M×N矩阵,x和y分别是Mx1和Nx1矢量。然后contour3(x,y,H)将起作用,产生所谓的3D图形。

如果依赖矢量场,则必须指定6个相应大小的相应x,y,z坐标和Fx,Fy,Fz矢量值的矢量/矩阵。 在那种情况下,quiver3(x,y,z,Fx,Fy,Fz)将工作,产生6D图。 明智地使用它!

当我评论Ander的答案时,你可以使用colourspace来获得更多的维度,所以你可以创建5D或理论上6D,因为你有位置的X,y,z坐标和R,G,值的B坐标。我建议对5D图使用静态(x,y,R,G,B),为6D使用动画(x,y,t,R,G,B)。 明智地使用它!

在示例中,我展示了上面提到的所有方法。我选择了重力场并计算了重心以下0.25平方的平面。

假设在极坐标中定义的力场为 F = - r / r ^ 3; F = 1 / R ^ 2。 这里 x y 都在-1; 1和相同大小N的范围内。 F 是MxMx3矩阵,其中 F (ii,jj)是对应于 x (ii)和 y (JJ)。 矩阵 H (ii,jj)是 F (ii,jj)和 X Y 的标准 Z 是坐标矩阵。

最后一个命令确保F值在(-1; 1)范围内。 F./2+0.5移动F的值,使其适合RGB范围。颜色含义为:

  • 黑色表示(-1,-1,-1),
  • 红色为(1,-1,-1),
  • 灰色(0,0,0)

取消评论您想要查看的地块类型。对于箭头使用resolution为0.1,对于其他情况使用0.01。

clear all,close all
% Definition of coordinates 
resolution=0.1;
x=-1:resolution:1;
y=x;
z=-.25;

%definition of matrices
F=zeros([max(size(x))*[1 1],3]);    % matrix of the force
X=zeros(max(size(x))*[1 1]);        % X coordinates for quiver3
Y=X;                                % Y coordinates for quiver3
Z=X+z;                              % Z coordinates for quiver3                              

% Force F in polar coordinates
% F=-1/r^2
% spherical -> cartesian transformation

for ii=1:max(size(x))
  for jj=1:max(size(y))
    % temporary variables for transformations
    xyz=sqrt(x(ii)^2+y(jj)^2+z^2);
    xy= sqrt(x(ii)^2+y(jj)^2);
    sinarc=sin(acos(z/xyz));

    %filling the quiver3 matrices
    X(ii,jj)=x(ii);
    Y(ii,jj)=y(jj);

    F(ii,jj,3)=-z/xyz^2;
    if xy~=0 % 0/0 error for x=y=0
       F(ii,jj,2)=-y(jj)/xyz/xy*sinarc;
       F(ii,jj,1)=-x(ii)/xyz/xy*sinarc;
    end
    H(ii,jj)=sqrt(F(ii,jj,1)^2+F(ii,jj,2)^2+F(ii,jj,3)^2);
  end
end

F=F./max(max(max(F)));
% quiver3(X,Y,Z,F(:,:,1),F(:,:,2),F(:,:,3));
% image(x,y,F./2+0.5),set(gca,'ydir','normal');
% surf(x,y,Z,F./2+.5,'linestyle','none')
% surf(x,y,H,'linestyle','none')
surfc(x,y,H,'linestyle','none')
% contour3(x,y,H,15)