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), 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
Sebastian Hölz (2020). cline (https://www.mathworks.com/matlabcentral/fileexchange/14677-cline), MATLAB Central File Exchange. Retrieved .
How I can change the range of colors. I use the following command but it does not effect
c = linspace(50, 100, size(data,1));
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.
Thank you for the great function! Is it also possible to animate this line?
@Dennis: Simple solution:
h = cline(...);
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.
Is it possible to obtain dots instead of a line?
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
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')
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
This is really a great submission. I can think of vaery many ways of using it.
For starters, in conjunction with Colorspace transforamtions
( www.mathworks.com/matlabcentral/fileexchange/28790-colorspace-transformations ) I used it for an example in my Perceptually improved colormaps submission. I used cline this way:
% 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];
% figure; cline(a, b, L, L,RGBhlx); view(3);
Beautiful file, thanks a bunch. Quite simple, works well.
it doesn't work for me when cdata is a matrix
Inspired by: Linear 2D Plot with Rainbow Color
Inspired: Perceptually improved colormaps