我想绘制三维数据的等高线图。
我在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也必须是向量。
答案 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))
解决此问题,并且可能适用于您的情况,但您需要小心。在您的示例中,X
和Y
似乎与FS
无法以编程方式相关。要获得有意义的等高线图,您需要确保FS(ii,jj,k)
[1]对应于X(ii,jj)
,否则您的等高线图将没有意义。
通常,您希望将FS
的结果与您用来计算它的变量进行对比,例如ii
,jj
或k
,但是,我不知道这些是什么样的,所以我会在这里停止解释。
答案 1 :(得分:1)
我不确定这个解决方案是否符合您的要求。
您的问题是contour
和contour3
是用于表示2D对象中的标量字段的图。请注意,球是2D物体 - 每个点都由角度theta和phi定义 - 即使它是"空间"不在"飞机"。
对于矢量字段的表示,有quiver
,quiver3
,streamslice
和streamline
函数。
如果要使用等高线图,则必须将数据从矢量场转换为标量场。因此,您的 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范围。颜色含义为:
取消评论您想要查看的地块类型。对于箭头使用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)