MATLAB Answers

How do I label a contour plot in the same colors as the contour lines?

85 views (last 30 days)
Heidi Hirsh
Heidi Hirsh on 24 Oct 2017
Commented: Yair Altman on 12 Nov 2017
I am hoping to create a contour plot with each line labeled in the same color as that line. I have found instructions for doing this in Python but cannot find the relevant code for matlab.
This is the code I found online (for Python I think): http://python4esac.github.io/plotting/matplotlib.html

  2 Comments

Walter Roberson
Walter Roberson on 24 Oct 2017
There is a hint that this might perhaps be possible. The contour object, h, has a hidden property LabelTextProperties, that has a ColorData field that is maybe changeable to a color table. The problem with that is that because it is a hidden property, there is no good way to set the property.
The contour object has a java() method that allows you to dig into the java representation. That includes getting the children objects, which are various text and line objects and a couple of other things I have not explored. I have no yet found any way to change the color of the text objects (just of the line objects.)
Rik
Rik on 25 Oct 2017
I all else fails, you could just insert text objects with a white background. This would require a lot of manual labor to properly align and rotate, and would break the moment you decide to resize your plot. So really a last ditch effort.

Sign in to comment.

Accepted Answer

Yair Altman
Yair Altman on 25 Oct 2017
Edited: Yair Altman on 25 Oct 2017
There is no need to use Java, just to use the two hidden (undocumented/unsupported) properties TextPrims (the text label handles) and EdgePrims (the contour line handles), as shown below. For additional info on customizing the contour labels/lines/faces read https://undocumentedmatlab.com/blog/customizing-contour-plots
% Create a simple contour plot
x = -2:0.2:2;
y = -2:0.2:3;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2-Y.^2);
[C,hContour] = contour(X,Y,Z, 'ShowText','on');
% Update the text label colors
levels = hContour.LevelList;
labels = hContour.TextPrims; % undocumented/unsupported
lines = hContour.EdgePrims; % undocumented/unsupported
for idx = 1 : numel(labels)
labelValue = str2num(labels(idx).String);
lineIdx = find(abs(levels-labelValue)<3*eps, 1); %avoid FP errors using eps
labels(idx).ColorData = lines(lineIdx).ColorData;
end

  7 Comments

Show 4 older comments
Yair Altman
Yair Altman on 26 Oct 2017
try to add a call to drawnow after the contour creation, before updating the labels.

Sign in to comment.

More Answers (0)

Sign in to answer this question.