File Exchange

image thumbnail


version 1.0 (8.38 KB) by

Draw a colored line in 2D or 3D

8 Ratings



View License

There are several files on the FEX which deal with the plotting of colored lines, but they all have some drawbacks. I wrote a little file, which extends the scope of the submission by Kun Liu (s. below, hoping to deliver a general purpose file, which should work for most purposes.

h = cline(x, y [, z, cdata])

x: vector with x-values
y: vector with y-values
z (opt.): vector with z-values
cdata (opt.): vector with color-data

2 input arguments => cdata = y; z=0
3 input arguments => cdata = z
4 i.a. & z = [] => cdata = y; z=0

h: Handle to line (i.e. patch-object !!!)

t = 2*pi:.1:8*pi;

cline(sqrt(t).*sin(t), sqrt(t).*cos(t));
cline(sqrt(t).*sin(t), sqrt(t).*cos(t), t);
cline(sqrt(t).*sin(t), sqrt(t).*cos(t), t, rand(size(t))); view(3)
cline(sqrt(t).*sin(t), sqrt(t).*cos(t), [], rand(size(t))); view(3)

OK, hope you find this file useful


Comments and Ratings (15)


Great function.
Should there be a "||" between lines 64 and 65?
"Consider using newline, semicolon, or comma before this statement for readability."
"Terminate statement with semicolon to suppress output (in functions)."
I think MATLAB is interpreting line 65 as a statement of the IF function rather than as part of the conditional statement.

I am using MATLAB R2017a Windows.



SNyk (view profile)

Thank you for the great function! Is it also possible to animate this line?

Sebastian Hölz

@Dennis: Simple solution:

h = cline(...);



Hi Dennis,
If we replace line 82 with
set(p,'cdata', cdata, 'marker', 's', 'edgecolor','interp')
, it will also plot the points.
However, I do not know how to only plot the points and not the line. Maybe Sebastian can comment on his great function.

Great function,

Is it possible to obtain dots instead of a line?

Regards, Dennis.

William Silva


Nice function.
Answering to Xavi Alonso (even if comment is quite old), you could insert a matrix mx3 just be reshaping cdata in a way you have mx1x3.
Indeed I have modified cline function replacing rows 76-81 with:

elseif nargin == 4
if isempty(z); z = zeros(size(x)); end
p = patch([x(:); nan], [y(:); nan], [z(:); nan], 0);
cdata = [cdata;nan nan nan];

it is not optimized maybe but however it worked for me.
Hope this help


Sebastian Hölz


Use the following syntax:

fig = figure;
h = cline(...);

The increased line-width will not be displayed, if you use "painters" as renderer for your figure. Therefore, you will have to change it:

set(fig, 'renderer', 'zbuffer')

- or -

set(fig, 'renderer', 'opengl')




Jaap (view profile)

Thanks for the post, I find it very useful. Do you perhaps know a way to increase the thickness of the line? Adding filled circular patch markers does do something, but the markersize makes a very sharp transition at 4.8-4.9.


Great, works perfectly, thanks

Matteo Niccoli

This is really a great submission. I can think of vaery many ways of using it.

For starters, in conjunction with Colorspace transforamtions
( ) I used it for an example in my Perceptually improved colormaps submission. I used cline this way:

% J=jet(256);
% LJ=colorspace('RGB->Lab',J);
% figure; cline([1:1:256],LJ(:,1),LJ(:,1),[1:1:256],J);
% title ('L* plot for jet colormap','Color','k','FontSize',12);

Also, as I was reading Steve's post on Lab based colormaps (thank you Steve!), I used cline this way to help me visualize things (notice again I used colorspace):

% radius = 50;
% theta = linspace(0, pi/2, 256).';
% a = radius * cos(theta);
% b = radius * sin(theta);
% L = linspace(0, 100, 256).';
% Lab = [L, a, b];
% RGBhlx=colorspace('RGB<-Lab',(Lab));
% figure; cline(a, b, L, L,RGBhlx); view(3);
% VIEW(-165,-15);

Sean Torrez

Beautiful file, thanks a bunch. Quite simple, works well.

Xavi Alonso

it doesn't work for me when cdata is a matrix

Matt Bennett

MATLAB Release
MATLAB 7.0.4 (R14SP2)

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video