Undocumented Matlab
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT

Customizing contour plots part 2

March 9, 2016 5 Comments

A few months ago I discussed various undocumented manners by which we can customize Matlab contour plots. A short while ago I receive an email from a blog reader (thanks Frank!) alerting me to another interesting way by which we can customize such plots, using the contour handle’s hidden ContourZLevel property. In today’s post I will explain how we can use this property and expand the discussion with some visualization interactivity.

The ContourZLevel property

The contour handle’s ContourZLevel property is a hidden property. This means that, just like all other hidden properties, it is accessible if we just happen to know its name (which is easy using my getundoc utility). This property sets the Z level at which the contour lines are drawn.
For example, by default the meshc function sets ContourZLevel‘s value to the bottom of the 3D display (in other words, to the axes’ ZLim(1) value). This is done within the mesh.m function:

Standard Matlab meshc output (contour at bottom)
Standard Matlab meshc output (contour at bottom)

We can, however, modify the contour’s level value to any other Z location:

% create a mesh and contour plot
handles = meshc(peaks);
% handles is a 2-element array of handles: the surface plot and the contours
hContour = handles(2); % get the handle to the contour lines
hContour.ContourZLevel = 4.5; % set the contour's Z position (default: hAxes.ZLim(1)=-10)
% We can also customize other aspects of the contour lines, for example:
hContour.LineWidth = 2; % set the contour lines' width (default: 0.5)

% create a mesh and contour plot handles = meshc(peaks); % handles is a 2-element array of handles: the surface plot and the contours hContour = handles(2); % get the handle to the contour lines hContour.ContourZLevel = 4.5; % set the contour's Z position (default: hAxes.ZLim(1)=-10) % We can also customize other aspects of the contour lines, for example: hContour.LineWidth = 2; % set the contour lines' width (default: 0.5)

Customized Matlab meshc output
Customized Matlab meshc output

Adding some visualization interactivity

Now let’s add some fun interactivity using a vertical slider to control the contour’s height (Z level). Matlab’s slider uicontrol is really just an ugly scrollbar, so we’ll use a Java JSlider instead:

% Add a controlling slider to the figure
jSlider = javaObjectEDT(javax.swing.JSlider);
jSlider.setOrientation(jSlider.VERTICAL);
jSlider.setPaintTicks(true);
jSlider.setMajorTickSpacing(20);
jSlider.setMinorTickSpacing(5);
jSlider.setBackground(java.awt.Color.white);
[hjSlider, hContainer] = javacomponent(jSlider, [10,10,30,120], gcf);
% Set the slider's action callback
hAxes = hContour.Parent;  % handle to containing axes
zmin = hAxes.ZLim(1);
zmax = hAxes.ZLim(2);
zrange = zmax - zmin;
cbFunc = @(hSlider,evtData) set(hContour,'ContourZLevel',hSlider.getValue/100*zrange+zmin);
hjSlider.StateChangedCallback = cbFunc;  % set the callback for slider action events
cbFunc(hjSlider,[]);  % evaluate the callback to synchronize the initial display

% Add a controlling slider to the figure jSlider = javaObjectEDT(javax.swing.JSlider); jSlider.setOrientation(jSlider.VERTICAL); jSlider.setPaintTicks(true); jSlider.setMajorTickSpacing(20); jSlider.setMinorTickSpacing(5); jSlider.setBackground(java.awt.Color.white); [hjSlider, hContainer] = javacomponent(jSlider, [10,10,30,120], gcf); % Set the slider's action callback hAxes = hContour.Parent; % handle to containing axes zmin = hAxes.ZLim(1); zmax = hAxes.ZLim(2); zrange = zmax - zmin; cbFunc = @(hSlider,evtData) set(hContour,'ContourZLevel',hSlider.getValue/100*zrange+zmin); hjSlider.StateChangedCallback = cbFunc; % set the callback for slider action events cbFunc(hjSlider,[]); % evaluate the callback to synchronize the initial display

Interactive contour height
Interactive contour height

Related posts:

  1. Customizing contour plots part 2 – Matlab contour labels' color and font can easily be customized. ...
  2. Customizing contour plots – Contour labels, lines and fill patches can easily be customized in Matlab HG2. ...
  3. Customizing histogram plots – Basic bar charts and histogram plots can be customized in important aspects. ...
  4. Customizing figure toolbar background – Setting the figure toolbar's background color can easily be done using just a tiny bit of Java magic powder. This article explains how. ...
  5. Customizing axes part 3 – Backdrop – Matlab HG2 axes can be customized in many different ways. This article explains some of the undocumented aspects. ...
  6. Customizing uiundo – This article describes how Matlab's undocumented uiundo undo/redo manager can be customized...
HG2 Java Pure Matlab Undocumented property
Print Print
« Previous
Next »
5 Responses
  1. Kerem March 27, 2016 at 11:42 Reply

    Hello,
    Why do I get an error
    “??? Reference to non-existent field ‘Parent’.” hCountour is defined in the first code part you gave.
    I simply copy and past two fields.

    • Yair Altman March 27, 2016 at 18:58 Reply

      @Kerem – you did not copy properly. It is hContour, not hCountour. As to why the Parent field does not exist, perhaps you are using an old Matlab version (HG1, R2014a or older).

  2. Mark April 11, 2016 at 23:12 Reply

    I displace the contour plane using the documented feature hgtransform.

    % get empty identity transform
    hT = hgtransform; 
    % create transform matrix for z-distance zDisplace
    hT.Matrix = makehgtform('translate',[0 0 zDisplace]); 
    % Transform Parent
    hContour.Parent = hT;

    % get empty identity transform hT = hgtransform; % create transform matrix for z-distance zDisplace hT.Matrix = makehgtform('translate',[0 0 zDisplace]); % Transform Parent hContour.Parent = hT;

  3. RicardoMBorges June 19, 2017 at 15:39 Reply

    Hello. Thanks for this.
    I’m looking for a way to add this scroll bar but using Level as action. I want to mess around with the cutting level of a contour plot interactively.
    Thanks for any help.

    • Yair Altman July 16, 2017 at 00:13 Reply

      @Ricardo – I don’t quite understand what you need. In general, if you want to change the action of the slider then simply update its callback function:

      cbFunc = @(hSlider,evtData) set(hContour,'ContourZLevel',hSlider.getValue/100*zrange+zmin);

      cbFunc = @(hSlider,evtData) set(hContour,'ContourZLevel',hSlider.getValue/100*zrange+zmin);

  4. Indira X October 10, 2019 at 10:29 Reply

    Hello,
    I use “surf” with x and y as vectors, and z as matrix. I want to move the contours at 59.7 in z, so I wrote this:

    handles = meshc(z);
    hContour = handles(2);
    hContour.ContourZLevel = 59.5;

    handles = meshc(z); hContour = handles(2); hContour.ContourZLevel = 59.5;

    I don’t see the contours, instead I see a small “bar” along z axis.

    May you please give me a hint?

    Thanks in advance.

Leave a Reply
HTML tags such as <b> or <i> are accepted.
Wrap code fragments inside <pre lang="matlab"> tags, like this:
<pre lang="matlab">
a = magic(3);
disp(sum(a))
</pre>
I reserve the right to edit/delete comments (read the site policies).
Not all comments will be answered. You can always email me (altmany at gmail) for private consulting.

Click here to cancel reply.

Useful links
  •  Email Yair Altman
  •  Subscribe to new posts (feed)
  •  Subscribe to new posts (reader)
  •  Subscribe to comments (feed)
 
Accelerating MATLAB Performance book
Recent Posts

Speeding-up builtin Matlab functions – part 3

Improving graphics interactivity

Interesting Matlab puzzle – analysis

Interesting Matlab puzzle

Undocumented plot marker types

Matlab toolstrip – part 9 (popup figures)

Matlab toolstrip – part 8 (galleries)

Matlab toolstrip – part 7 (selection controls)

Matlab toolstrip – part 6 (complex controls)

Matlab toolstrip – part 5 (icons)

Matlab toolstrip – part 4 (control customization)

Reverting axes controls in figure toolbar

Matlab toolstrip – part 3 (basic customization)

Matlab toolstrip – part 2 (ToolGroup App)

Matlab toolstrip – part 1

Categories
  • Desktop (45)
  • Figure window (59)
  • Guest bloggers (65)
  • GUI (165)
  • Handle graphics (84)
  • Hidden property (42)
  • Icons (15)
  • Java (174)
  • Listeners (22)
  • Memory (16)
  • Mex (13)
  • Presumed future risk (394)
    • High risk of breaking in future versions (100)
    • Low risk of breaking in future versions (160)
    • Medium risk of breaking in future versions (136)
  • Public presentation (6)
  • Semi-documented feature (10)
  • Semi-documented function (35)
  • Stock Matlab function (140)
  • Toolbox (10)
  • UI controls (52)
  • Uncategorized (13)
  • Undocumented feature (217)
  • Undocumented function (37)
Tags
ActiveX (6) AppDesigner (9) Callbacks (31) Compiler (10) Desktop (38) Donn Shull (10) Editor (8) Figure (19) FindJObj (27) GUI (141) GUIDE (8) Handle graphics (78) HG2 (34) Hidden property (51) HTML (26) Icons (9) Internal component (39) Java (178) JavaFrame (20) JIDE (19) JMI (8) Listener (17) Malcolm Lidierth (8) MCOS (11) Memory (13) Menubar (9) Mex (14) Optical illusion (11) Performance (78) Profiler (9) Pure Matlab (187) schema (7) schema.class (8) schema.prop (18) Semi-documented feature (6) Semi-documented function (33) Toolbar (14) Toolstrip (13) uicontrol (37) uifigure (8) UIInspect (12) uitools (20) Undocumented feature (187) Undocumented function (37) Undocumented property (20)
Recent Comments
  • Rolf (18 days 10 hours ago): Disclosure: This comes from the developer/vendor of the Code Checker for MATLAB. Have a look at the Code Checker for MATLAB by MonkeyProof Solutions which has many such (configurable)...
  • Yair Altman (26 days 3 hours ago): In theory you could use the data: URI scheme (e.g. .load('data:text/html,<html ><body>Hello world</body></html>')), but for some reason it doesn’t work well in...
  • Sebastian (26 days 9 hours ago): Thanks for your update to the now unsupported `HTMLBrowserPanel`. I tried to replace it with the `LightweightHelpPanel` but the application I am working on is showing generated...
  • Leuze (48 days 10 hours ago): Hello, I would like to add a new object into SLDD and display columns according to my object properties <>
  • Eric Delgado (77 days 12 hours ago): Hey Yair, I think your site is the right place to share that I wrote ccTools, a lib that allows a lot of customizations of Matlab built-in web components (such as uifigure,...
  • Eric Delgado (77 days 12 hours ago): Hey guys, first of all, thanks to @Yair, your site saved me a lot of times! 🙂 That’s why I am sharing that I wrote m2mlapp (*.m => *.mlapp) file conversion, that...
  • François (94 days 10 hours ago): more than 10 years later it helps me after struggling few hours, so thanks you very much !
  • Yair Altman (95 days 8 hours ago): I am not familiar with a universal catch-all tab-completion mechanism for all functions, and it also doesn’t make much sense to me, because different functions use...
  • Arye (96 days 2 hours ago): hi, is there a universal functionSignature.json file that will allow my to get the function hints when opening brackets of my funcs? something that automaticly recognize my function...
  • Sunham (98 days 21 hours ago): This is an old article, but the issue persists even in 2023. 2023a: z = mat2cell(1:1e6,1,repmat(1,1,1e 6)); f = @() cellfun(‘isempty’, z); g = @() cellfun(@isempty,z);...
  • Yair Altman (108 days 11 hours ago): Robot only runs when you tell it to run a command such as keyPress. If you don’t tell it to run a command, it uses no CPU, so there’s no need to remove the Robot...
  • Eric (108 days 22 hours ago): Hey @Kevin, can you share your code about create group of figures in the AppContainer? The container of multiples uifigures could be an amazing improvement over AppDesigner and its...
  • Elsa Smith (109 days 13 hours ago): I recently used java.awt.Robot to perform GUI testing on MATLAB and found it to be an extremely easy and useful way to control mouse movements.
  • Elsa Smith (109 days 13 hours ago): I’m suspecting that the slow performance of my GUI may be due to the use of java.awt.Robot. Is there a way to cancel/stop/remove the robot after it has been created, or is...
  • Michelle Kline (110 days 6 hours ago): *edit* tip about fopen(), not about fwrite(). ‘Wb’ vs. ‘wb’
Contact us
Captcha image for Custom Contact Forms plugin. You must type the numbers shown in the image
Undocumented Matlab © 2009 - Yair Altman
This website and Octahedron Ltd. are not affiliated with The MathWorks Inc.; MATLAB® is a registered trademark of The MathWorks Inc.
Scroll to top