MATLAB streamribbon边缘颜色

时间:2015-06-26 04:46:04

标签: matlab

在一个streamribbon情节中,你如何绘制色带边缘,而不是每个面的边缘?

例如:

figure
load wind
[sx sy sz] = meshgrid(80,20:10:50,0:5:15);
h = streamribbon(x,y,z,u,v,w,sx,sy,sz);
axis tight
shading interp;
view(3);
camlight
lighting gouraud

产地: Raw output

如果我添加set(h,'edgecolor','k')

我得到: Output with edge turned to 'k'

而我正在寻找的东西是这样的(图像的顶部和左侧都是用gimp编辑的,以说明我正在追逐的内容): Edited with gimp

1 个答案:

答案 0 :(得分:3)

如评论中所述,没有简单的方法可以照亮色带表面的某些边缘而不是其他边缘。

但是,色带表面只是由边缘上的点定义,因此只需检索这些点并重新组织它们(内嵌它们)即可获得3D线条的完美坐标。
要获取已关闭的配置文件,我们只需要复制配置文件末尾的第一个点。

我将其打包到一个函数中,该函数将返回一组与函数句柄数组大小相同的handles,并传输您可以发送到内部plot3函数的任何其他参数。因此使用非常简单:

因此使用与问题完全相同的代码(在变量h中检索功能区表面句柄数组),添加:

hs = StreamEdges( h , 'k','Linewidth',1 ) ;

将产生:
streamborder

当然,您总是会发疯并在组中设置您的线路属性:

set(hs,'LineWidth',1,'Color','c')
%// or
set(hs,'LineWidth',2,'Color','r','Marker','none')

other edges

功能代码StreamEdges.m

function hs = StreamEdges(hribbon,varargin)

wasOnHold = ishold ;            %// save hold state
hold on

hs = zeros( size(hribbon) ) ;   %// initialize output handle array
for ih=1:numel( hribbon ) ;
    %// retrieve X, Y, and Z data of each surface
    hsurf = handle( hribbon(ih)) ;  %// for pre-HG2 (2014a) versions
    xx = hsurf.XData ;
    yy = hsurf.YData ;
    zz = hsurf.ZData ;

    %// reoder coordinates to linearise surface profile (edge)
    xx = [xx(:,1) ; flipud(xx(:,2)) ; xx(1)] ;
    yy = [yy(:,1) ; flipud(yy(:,2)) ; yy(1)] ;
    zz = [zz(:,1) ; flipud(zz(:,2)) ; zz(1)] ;

    %// return double to stay compatible with pre-HG2
    hs(ih) = double( plot3(xx(:),yy(:),zz(:), varargin{:} ) ) ;
end

if ~wasOnHold ; hold off ; end      %// restore hold state
hs = handle(hs) ;                   %// convert "double" handle back to HG2 handles

该功能应该适用于版本pre-HG2(= pre 2014b)或post-HG2。它将返回的句柄数组将采用HG2格式(=真正的句柄,而不仅仅是它们的double表示)。这使您可以访问图形对象上的点表示法,即使对于HG2之前的版本也是如此。如果您对此不满意,只需注释函数的最后一行(或获取旧的句柄样式,您始终可以使用函数 hs = double(hs)

定位axes

除了保留hold状态外,该函数的行为与大多数高级绘图函数一样,这意味着它们将直接转到当前axesgca)或创建一个新的,如果不存在的话 您可以轻松修改函数以接受axes句柄作为目标,或者只是不加修改,在参数中明确调用它:

hs = StreamEdges( h , 'Parent','target_axes_handle' , 'Color','k','Linewidth',1) ;