我正在尝试为以下方程式绘制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)');
答案 0 :(得分:5)
您可以通过建立一组要传递给surf
的新矩阵来添加额外的曲面,并根据您希望结果的外观使用一些不同的选项...
如果您只想填充侧面,则可以在矩阵的每一侧添加新的行和列,如下所示:
[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
来绘制表面和侧面,结果是:
如果您还想填充形状的底部,则可以通过添加新的列,然后在顶部和底部添加新的行以闭合末端,来在其周围和下方包裹表面:
[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
来绘制整个闭合曲面。这是从下面看的视图,显示了封闭的底部:
在将所有内容绘制为一个对象时,如果要以不同于顶部的方式渲染侧面,则会受到限制。将两边分开放置为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);
结果图:
答案 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')
将渲染:
答案 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
和适当的坐标。