matlab 实现多维作图函数(slice)

四维作图:

这个问题可以用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值呢,谢谢

 

matlab 实现多维作图函数(slice)_第1张图片

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);

这个是设置了颜色的图

你可能感兴趣的:(matlab 实现多维作图函数(slice))