Plot lines as patches (efficiently) SYNTAX: patchline(xs,ys) patchline(xs,ys,zs,...) patchline(xs,ys,zs,'PropertyName',propertyvalue,...) p = patchline(...) PROPERTIES: Accepts all parameter-values accepted by PATCH. DESCRIPTION: p = patchline(xs,ys,zs,'PropertyName',propertyvalue,...) Takes a vector of x-values (xs) and a same-sized vector of y-values (ys). z-values (zs) are supported, but optional; if specified, zs must occupy the third input position. Takes all P-V pairs supported by PATCH. Returns in p the handle to the resulting patch object. NOTES: Note that we are drawing 0-thickness patches here, represented only by their edges. FACE PROPERTIES WILL NOT NOTICEABLY AFFECT THESE OBJECTS! (Modify the properties of the edges instead.) LINUX (UNIX) USERS: One test-user found that this code worked well on his Windows machine, but crashed his Linux box. We traced the problem to an openGL issue; the problem can be fixed by calling 'opengl software' in your <http://www.mathworks.com/help/techdoc/ref/startup.html startup.m>. (That command is valid at startup, but not at runtime, on a unix machine.) EXAMPLES: %% Example 1: n = 10; xs = rand(n,1); ys = rand(n,1); zs = rand(n,1)*3; plot3(xs,ys,zs,'r.') xlabel('x');ylabel('y');zlabel('z'); p = patchline(xs,ys,zs,'linestyle','--','edgecolor','g',... 'linewidth',3,'edgealpha',0.2); %% Example 2: (Note "hold on" not necessary here!) t = 0:pi/64:4*pi; p(1) = patchline(t,sin(t),'edgecolor','b','linewidth',2,'edgealpha',0.5); p(2) = patchline(t,cos(t),'edgecolor','r','linewidth',2,'edgealpha',0.5); l = legend('sine(t)','cosine(t)'); tmp = sort(findobj(l,'type','patch')); for ii = 1:numel(tmp) set(tmp(ii),'facecolor',get(p(ii),'edgecolor'),'facealpha',get(p(ii),'edgealpha'),'edgecolor','none') end %% Example 3 (requires Image Processing Toolbox): %% (NOTE that this is NOT the same as showing a transparent image on %% of the existing image. (That functionality is %% available using showMaskAsOverlay or imoverlay). %% Instead, patchline plots transparent lines over %% the image.) img = imread('rice.png'); imshow(img) img = imtophat(img,strel('disk',15)); grains = im2bw(img,graythresh(img)); grains = bwareaopen(grains,10); edges = edge(grains,'canny'); boundaries = bwboundaries(edges,'noholes'); cmap = jet(numel(boundaries)); ind = randperm(numel(boundaries)); for ii = 1:numel(boundaries) patchline(boundaries{ii}(:,2),boundaries{ii}(:,1),... 'edgealpha',0.2,'edgecolor',cmap(ind(ii),:),'linewidth',3); end Written by Brett Shoelson, PhD brett.shoelson@mathworks.com 5/31/2012 Revisions: 6/26 Improved rice.png example, modified FEX image. Copyright 2012 MathWorks, Inc. See also: patch, line, plot
0001 function p = patchline(xs,ys,varargin) 0002 % Plot lines as patches (efficiently) 0003 % 0004 % SYNTAX: 0005 % patchline(xs,ys) 0006 % patchline(xs,ys,zs,...) 0007 % patchline(xs,ys,zs,'PropertyName',propertyvalue,...) 0008 % p = patchline(...) 0009 % 0010 % PROPERTIES: 0011 % Accepts all parameter-values accepted by PATCH. 0012 % 0013 % DESCRIPTION: 0014 % p = patchline(xs,ys,zs,'PropertyName',propertyvalue,...) 0015 % Takes a vector of x-values (xs) and a same-sized 0016 % vector of y-values (ys). z-values (zs) are 0017 % supported, but optional; if specified, zs must 0018 % occupy the third input position. Takes all P-V 0019 % pairs supported by PATCH. Returns in p the handle 0020 % to the resulting patch object. 0021 % 0022 % NOTES: 0023 % Note that we are drawing 0-thickness patches here, 0024 % represented only by their edges. FACE PROPERTIES WILL 0025 % NOT NOTICEABLY AFFECT THESE OBJECTS! (Modify the 0026 % properties of the edges instead.) 0027 % 0028 % LINUX (UNIX) USERS: One test-user found that this code 0029 % worked well on his Windows machine, but crashed his 0030 % Linux box. We traced the problem to an openGL issue; 0031 % the problem can be fixed by calling 'opengl software' 0032 % in your <http://www.mathworks.com/help/techdoc/ref/startup.html startup.m>. 0033 % (That command is valid at startup, but not at runtime, 0034 % on a unix machine.) 0035 % 0036 % EXAMPLES: 0037 %%% Example 1: 0038 % 0039 % n = 10; 0040 % xs = rand(n,1); 0041 % ys = rand(n,1); 0042 % zs = rand(n,1)*3; 0043 % plot3(xs,ys,zs,'r.') 0044 % xlabel('x');ylabel('y');zlabel('z'); 0045 % p = patchline(xs,ys,zs,'linestyle','--','edgecolor','g',... 0046 % 'linewidth',3,'edgealpha',0.2); 0047 % 0048 %%% Example 2: (Note "hold on" not necessary here!) 0049 % 0050 % t = 0:pi/64:4*pi; 0051 % p(1) = patchline(t,sin(t),'edgecolor','b','linewidth',2,'edgealpha',0.5); 0052 % p(2) = patchline(t,cos(t),'edgecolor','r','linewidth',2,'edgealpha',0.5); 0053 % l = legend('sine(t)','cosine(t)'); 0054 % tmp = sort(findobj(l,'type','patch')); 0055 % for ii = 1:numel(tmp) 0056 % set(tmp(ii),'facecolor',get(p(ii),'edgecolor'),'facealpha',get(p(ii),'edgealpha'),'edgecolor','none') 0057 % end 0058 % 0059 %%% Example 3 (requires Image Processing Toolbox): 0060 %%% (NOTE that this is NOT the same as showing a transparent image on 0061 %%% of the existing image. (That functionality is 0062 %%% available using showMaskAsOverlay or imoverlay). 0063 %%% Instead, patchline plots transparent lines over 0064 %%% the image.) 0065 % 0066 % img = imread('rice.png'); 0067 % imshow(img) 0068 % img = imtophat(img,strel('disk',15)); 0069 % grains = im2bw(img,graythresh(img)); 0070 % grains = bwareaopen(grains,10); 0071 % edges = edge(grains,'canny'); 0072 % boundaries = bwboundaries(edges,'noholes'); 0073 % cmap = jet(numel(boundaries)); 0074 % ind = randperm(numel(boundaries)); 0075 % for ii = 1:numel(boundaries) 0076 % patchline(boundaries{ii}(:,2),boundaries{ii}(:,1),... 0077 % 'edgealpha',0.2,'edgecolor',cmap(ind(ii),:),'linewidth',3); 0078 % end 0079 % 0080 % Written by Brett Shoelson, PhD 0081 % brett.shoelson@mathworks.com 0082 % 5/31/2012 0083 % 0084 % Revisions: 0085 % 6/26 Improved rice.png example, modified FEX image. 0086 % 0087 % Copyright 2012 MathWorks, Inc. 0088 % 0089 % See also: patch, line, plot 0090 0091 [zs,PVs] = parseInputs(varargin{:}); 0092 if rem(numel(PVs),2) ~= 0 0093 % Odd number of inputs! 0094 error('patchline: Parameter-Values must be entered in valid pairs') 0095 end 0096 0097 % Facecolor = 'k' is (essentially) ignored here, but syntactically necessary 0098 if isempty(zs) 0099 p = patch([xs(:);NaN],[ys(:);NaN],'k'); 0100 else 0101 p = patch([xs(:);NaN],[ys(:);NaN],[zs(:);NaN],'k'); 0102 end 0103 0104 % Apply PV pairs 0105 for ii = 1:2:numel(PVs) 0106 set(p,PVs{ii},PVs{ii+1}) 0107 end 0108 if nargout == 0 0109 clear p 0110 end 0111 0112 function [zs,PVs] = parseInputs(varargin) 0113 if isnumeric(varargin{1}) 0114 zs = varargin{1}; 0115 PVs = varargin(2:end); 0116 else 0117 PVs = varargin; 0118 zs = []; 0119 end