我如何在Matlab中的表面图的图形下方标记(或着色)区域?

时间:2019-05-29 11:01:45

标签: matlab

我正在尝试为以下方程式绘制3D表面图  t_t <=(xi_i-xi_j)。 sqrt(rho)。我已经包含了我的代码。但我想在此表面曲线图的下方标记或阴影区域。我该如何解决?

[X,Y] = meshgrid(1:0.5:10,1:20);

Z = X.* sqrt(Y);

figure;

colormap(jet)

surf(X,Y,Z) 

colorbar

xlabel('Distance between two spatial points \xi_i & \xi_j (\xi_i - \xi_j)');

ylabel('Density(\rho)');

zlabel('Transmission Delay (t_t)');

enter image description here

3 个答案:

答案 0 :(得分:5)

您可以通过建立一组要传递给surf的新矩阵来添加额外的曲面,并根据您希望结果的外观使用一些不同的选项...

选项1:填充侧面和一个表面对象:

如果您只想填充侧面,则可以在矩阵的每一侧添加新的行和列,如下所示:

[R, C] = size(Z);
Xfill = [nan X(1, :) nan; X(:, [1 1:C C]); nan X(R, :) nan];
Yfill = [nan Y(1, :) nan; Y(:, [1 1:C C]); nan Y(R, :) nan];
Zfill = [nan zeros(1, C) nan; zeros(R, 1) Z zeros(R, 1); nan zeros(1, C) nan];

surf(Xfill, Yfill, Zfill);
view(-120, 30);

这使您可以通过一次调用surf来绘制表面和侧面,结果是:

enter image description here


选项2:填充侧面和底部,一个表面对象:

如果您还想填充形状的底部,则可以通过添加新的列,然后在顶部和底部添加新的行以闭合末端,来在其周围和下方包裹表面:

[R, C] = size(Z);
Xfill = [X(1, 1:C) nan(1, C+1); ...  % Close top
         X flip(X, 2) X(:, 1); ...   % Flip data and connect to other side
         X(R, 1:C) nan(1, C+1)];     % Close bottom
Yfill = [Y(1, 1:C) nan(1, C+1); ...
         Y flip(Y, 2) Y(:, 1); ...
         Y(R, 1:C) nan(1, C+1)];
Zfill = [zeros(1, C) nan(1, C+1); ...
         Z zeros(R, C) Z(:, 1); ...
         zeros(1, C) nan(1, C+1)];

surf(Xfill, Yfill, Zfill);
view(-120, -20);

同样,您可以通过一次调用surf来绘制整个闭合曲面。这是从下面看的视图,显示了封闭的底部:

enter image description here


选项3:为侧面添加单独的曲面对象:

在将所有内容绘制为一个对象时,如果要以不同于顶部的方式渲染侧面,则会受到限制。将两边分开放置为Ander does之类的对象(使用patch或单独调用surf)将使您可以更好地控制它们相对于顶面的着色方式。要为所有四个侧面制作一个单一的曲面对象,可以提取矩阵边缘周围的条目并根据需要复制它们:

[R, C] = size(Z);
Xside = [1; 1]*[X(1, :) ...           % Get first row
                X(2:R, C).' ...       % Get last column, without first row
                X(R, (C-1):-1:1) ...  % Get last row, without last column, flipped
                X((R-1):-1:1, 1).'];  % Get first column, without last row, flipped
Yside = [1; 1]*[Y(1, :) ...
                Y(2:R, C).' ....
                Y(R, (C-1):-1:1) ...
                Y((R-1):-1:1, 1).'];
Zside = [Z(1, :) ...
         Z(2:R, C).' ...
         Z(R, (C-1):-1:1) ...
         Z((R-1):-1:1, 1).'; ...
         zeros(1, 2*(R+C)-3)];

surf(X, Y, Z);  % Plot top surface
hold on;
surf(Xside, Yside, Zside, ...  % Plot all four sides...
     'EdgeColor', 'none', ...  %   with no edge coloring (i.e. grid)...
     'FaceAlpha', 0.5);        %   and transparency
view(-120, 30);

结果图:

enter image description here

答案 1 :(得分:4)

这是使用patch对象的另一种方法。

此解决方案与Ander的解决方案非常相似,但是patch的构造方式不同,因此您无需循环并仅需处理4个补丁实体即可。

%% Prepare domain limits
xLim = [1 10] ; xStep = 0.5 ;
yLim = [1 20] ; yStep = 1 ;

x = xLim(1):xStep:xLim(2) ;
y = yLim(1):yStep:yLim(2) ;

%% Your code
[X,Y] = meshgrid(x,y);
Z = X.* sqrt(Y);
figure;
surf(X,Y,Z) 
colorbar
xlabel('Distance between two spatial points \xi_i & \xi_j (\xi_i - \xi_j)');
ylabel('Density(\rho)');
zlabel('Transmission Delay (t_t)');

%% prepare patch elements
zLim = [min(Z) max(Z)] ;
pcol = [0.2857,1,0.7143] ;

xface = [ x xLim(2) xLim(1) ] ;
yface = [ y yLim(2) yLim(1) ] ;
xface0 = zeros(size(xface)) ;
yface0 = zeros(size(yface)) ;
xfaceZ = [zeros(size(x)) zLim(1) zLim(1)] ;
yfaceZ = [zeros(size(y)) zLim(1) zLim(1)] ;

%% display the patches
hp(1) = patch( xface , xface0+yLim(1) , xfaceZ ,pcol ) ;
hp(3) = patch( xface , xface0+yLim(2) , xfaceZ ,pcol ) ;
hp(2) = patch( yface0+xLim(1) , yface , yfaceZ ,pcol ) ;
hp(4) = patch( yface0+xLim(2) , yface , yfaceZ ,pcol ) ;

%% update top edge of patches
% to connect to the surface edges
hp(1).ZData(1:end-2) = Z(1,:) ;
hp(2).ZData(1:end-2) = Z(:,1) ;
hp(3).ZData(1:end-2) = Z(end,:) ;
hp(4).ZData(1:end-2) = Z(:,end) ;

%% Color according to preferences
set(hp, 'Facecolor',pcol , 'FaceAlpha',0.5 , 'EdgeColor','none')

将渲染:

enter image description here

答案 2 :(得分:3)

我能想到的唯一方法是在边缘上循环,并相应地填充它们。

[X,Y] = meshgrid(1:0.5:10,1:20);

Z = X.* sqrt(Y);

figure;


p=parula; % please do not use jet :(

surf(X,Y,Z) 
hold on;

%XZ init
for ii=1:size(Z,2)-1
    patch([X(1,ii) X(1,ii+1)  X(1,ii+1) X(1,ii)],...
          [Y(1,1) Y(1,1) Y(1,1) Y(1,1)],...
          [0  0 Z(1,ii+1) Z(1,ii) ],[p(1,:)]);
end

%XZ end
for ii=1:size(Z,2)-1
    patch([X(end,ii) X(end,ii+1)  X(end,ii+1) X(end,ii)],...
          [Y(end,1) Y(end,1) Y(end,1) Y(end,1)],...
          [0  0 Z(end,ii+1) Z(end,ii) ],[p(1,:)]);
end

%YZ init
for ii=1:size(Z,1)-1
    patch([X(1,1) X(1,1) X(1,1) X(1,1)],...
          [Y(ii,1) Y(ii+1,1) Y(ii+1,1) Y(ii,1)],...
          [0  0 Z(ii+1,1) Z(ii,1) ],[p(1,:)]);
end

%YZ end
for ii=1:size(Z,1)-1
    patch([X(1,end) X(1,end) X(1,end) X(1,end)],...
          [Y(ii,end) Y(ii+1,end) Y(ii+1,end) Y(ii,end)],...
          [0  0 Z(ii+1,end) Z(ii,end) ],[p(1,:)]);
end
colorbar

xlabel('Distance between two spatial points \xi_i & \xi_j (\xi_i - \xi_j)');

ylabel('Density(\rho)');

zlabel('Transmission Delay (t_t)');

您现在可以进行很多样式选择,例如去除边缘或更改我会留给您的颜色,因为它们可以在网上找到。

如果这不是您想要的,那么它仍然是您的理想选择。使用patch和适当的坐标。

enter image description here