四维作图:
这个问题可以用slice命令实现:
%%%=================================%%%
clear all
[x,y,z] = meshgrid(0:.5:10,0:.5:10,0:.5:10);
c = x.^2+y.^2+z.^2;
xs = [0,2,4,6,8,10];
ys = [4];
zs = [6]; % xs,ys,zs可决定切片形式和位置,helpslice可明白其具体含义
slice(x,y,z,c,xs,ys,zs)
colormap hsv
当然,只要doc surf, 就会发现,其实surf命令已经自带了颜色命令:
举一个简单例子如下(颜色向量看实际问题可以改变,以表示函数值):
%%%=================%%%
clear all
[X,Y]=meshgrid(0:.5:10);
c = rand(21);
Z=X^2-5*X.*Y+Y.^2;
surf(X,Y,Z,c);
[x,y,z] = meshgrid(-2:.2:2, -2:.25:2, -2:.16:2);
v = x .* exp(-x.^2 - y.^2 - z.^2);
slice(x,y,z,v,[-1.2 .8 2],2,[-2 -.2])
功能 立体切片图。该命令显示通过立体图形的矩形切片图。
用法 slice(X,Y,Z,V,sx,sy,sz)显示三元函数V=V(X,Y,Z)确定的超立体形在x-轴、y-轴与z-轴方向上的若干点(对应若干平面。即若函数V=V(X,Y,Z)中有一变量如X取一定值X0,则函数V=V(X0,Y,Z)变成一立体曲面(只不过是将该曲面通过颜色表示高度V,从而显示于一平面而已。)的切片图,各点的坐标由参量向量sx、sy与sz指定。参量X、参量Y与参量Z为三维数组,用于指定立方体V的坐标。参量X、Y与Z必须有单调的、正交的间隔(如同用命令meshgrid生成的一样)。在每一点上的颜色由对超立体V的三维内插值确定。
slice(V,sx,sy,sz)显示三元函数V=V(X,Y,Z)确定的超立体形在x-轴、y-轴与z-轴方向上的若干点(对应若干平面)的切片图,各点的坐标由数量向量sx、sy与sz指定。其中V为三维数组(阶数为m*n*p),缺省地有:X= 1:m、Y = 1:n、Z = 1:p。
slice(V,XI,YI,ZI)显示参量矩阵XI、YI与ZI确定的、超立体图形的切面图。参量XI、YI与ZI定义了一曲面,同时会在曲面的点上计算超立体V的值。参量XI、YI与ZI必须为同型矩阵。
slice(X,Y,Z,V,XI,YI,ZI) 沿着由矩阵XI、YI与ZI定义的曲面画穿过超立体图形V的切片。
slice(…,’method’) 指定内插值的方法。‘method’为如下方法之一:‘linear’、
‘cubic’、‘nearest’:
‘linear’——指定使用三次线性内插值法(该状态为缺省的);
‘cubic’—— 指定使用三次立方内插值法;
‘nearest’——指定使用最近点内插值法。
h = slice(…) 返回一曲面图形对象的句柄向量h。
>>x=[1 2 3 4 5 6]; >> y=[1 2 3 4 5 6]; >> z=[3 5 6 7 8 9]; >> [x1,y1,z1]=meshgrid(x,y,z); >> s=x1+y1+z1; >> slice(x1,y1,z1,s,1,2,8) 得到下面的图,我想要表达的是s=x+y+z,对应6个xyz应该只有6个s怎么在图上每个切片处都有对应的z值呢,谢谢 |
slice(x1,y1,z1,s,[],[],z)
可以实现只有6个z的切面图
分别试试下面的三个命令:
>> slice(x1,y1,z1,sk,[],[],s)
>> slice(x1,y1,z1,sk,x,[],s)
>> slice(x1,y1,z1,sk,x,y,s)
可否达到要求
######################################################################################################
对如下数据,做出截面图,并按相应的颜色值设置数据;
x y z s
1 2 2 25
1 3 3 21
1 4 4 20
2 5 5 19
2 6 7 31
这样一组s与x,y,z没有直接函数表达式关系的数据希望能够用slice函数绘出切面图,也就是说,在x=1这个切面上,应该有对应s=25 21 20这三种用颜色表示的函数值。
首先,看到slice命令的帮助文件中有个例子:
[x,y,z] = meshgrid(-2:.2:2,-2:.25:2,-2:.16:2);
v = x.*exp(-x.^2-y.^2-z.^2);
xslice = [-1.2,.8,2]; yslice = 2; zslice = [-2,0];
slice(x,y,z,v,xslice,yslice,zslice)
colormap hsv
这里的slice前三个参数,必须构成网格数据,如图:
通过:
[x,y,z] = meshgrid(-2:.2:2,-2:.25:2,-2:.16:2);
figure;
view(3);
hold on;
for i = 1 : size(x, 1)
for j = 1 : size(x, 2)
for k = 1 : size(x, 3)
plot3(x(i, j, k), y(i, j, k), z(i, j, k), '.');
end
end
end
这些点构成了网格数据
所以,我们需要制造网格数据,进行截面操作;
close all;
clc;
clear;
A = [1 2 2 25
1 3 3 21
1 4 4 20
2 5 5 19
2 6 7 31];
x = A(:, 1)';
y = A(:, 2)';
z = A(:, 3)';
s = A(:, 4)';
% 提取有效数据
xb = min(x);
xe = max(x);
yb = min(y);
ye = max(y);
zb = min(z);
ze = max(z);
sb = min(s);
se = max(s);
x1 = linspace(xb, xe, 30);
y1 = linspace(yb, ye, 30);
z1 = linspace(zb, ze, 30);
s0 = linspace(sb, se, 30);
% 对有效数据分割
[x1 y1 z1] = meshgrid(x1, y1, z1);
% 生成网格数据点
s1 = zeros(size(x1, 1), size(x1, 2));
for i = 1 : size(s1, 1)
s1(i, :) = s0;
end
st = zeros(size(x1, 1), size(x1, 2), size(x1, 3));
for i = 1 : size(st, 3)
st(:, :, i) = s1;
end
s1 = st;
% 构造第四维数据s1
figure;
hold on;
view(3);
slice(x1, y1, z1, s1, x, [], []);
这样就做出来所谓的截面图
这个是通过slice(x1, y1, z1, s1, x, y, []);来做的,但没有颜色值设置选项;
close all;
clc;
clear;
A = [1 2 2 25
1 3 3 21
1 4 4 20
2 5 5 19
2 6 7 31];
x = A(:, 1)';
y = A(:, 2)';
z = A(:, 3)';
s = A(:, 4)';
% 对有效数据分割
xb = min(x);
xe = max(x);
yb = min(y);
ye = max(y);
zb = min(z);
ze = max(z);
y1 = linspace(yb, ye, 30);
z1 = linspace(zb, ze, 30);
x1 = ones(size(y1, 1), size(y1, 2)) * x(1);
[x1, y1] = meshgrid(x1, y1);
z = zeros(length(z1));
for i = 1 : size(z, 1)
z(i, :) = z1;
end
surf(x1, y1, z);
% 这个时候产生了对应于x1的网格截面图,下面来定颜色
[a, b] = size(z);
rgb = ones(a, b);
len = length(s)+1;
slic = floor(linspace(1, a, len));
for i = 1 : length(slic)-1
rgb(slic(i):slic(i+1)-1, :) = rgb(slic(i):slic(i+1)-1, :)*s(i);
end
% 产生颜色值
figure;
surf(x1, y1, z, rgb);
这个是设置了颜色的图