MATLAB Answers

Background Color of UIAxes

131 views (last 30 days)
I am trying to use the new html style ui graphics as it looks that Matlab will soon be moving away from the Java-based graphics. With the Java-based graphics, it is possible to stack multiple axes on top of each other -- all with transparent backgrounds so as to be able to see through all the curves plotted on all the axes. This is the standard way of displaying more than 2 curves with the same x-axis but different y-axes. The commands are quite simple:
hf = figure;
ha1 = axes(hf,'Position',[0.1 0.2 0.7 0.5]);
ha2 = axes(hf,'Position',[0.2 0.25 0.7 0.5]); % This axes position is offset from previous for illustration.
The last command makes the back of axes ha2 transparent. Now a curve in ha1 (using a plot command) will be visible together with a curve in ha2.
I have tried to do the same with the new style ui graphics both using App Designer as well as programmatically and have thus been unsuccessful. Specifically, I've used the following commands:
uihf = uifigure;
uiha1 = uiaxes(uihf,'Position',[50 50 400 300]);
uiha2 = uiaxes(uihf,'Position',[100 100 400 300]);
Unlike with the Java-based graphics, the last command makes the plot area transparent; but the color seen is now that specified in the BackgroundColor property of the uiaxes defined as the "Color of margin around plot area". That property does not exist for the old style axes. Apparently, when the Color property of uiaxes is set to 'none' the BackgroundColor property color is assigned to the entire area of the uiaxes object. From within App Designer, clicking on the color pull down menu of the BackgroundColor shows "None" as one of the selections, indicating that this option should be selectable (unless it's there as a placeholder for future versions). However, clicking on it generates an error message: "Cannot set UIAxes BackgroundColor to 'none'". The same error occurs, if I were to type command
I searched the KB and did a general google search on this topic and found close to nothing on this topic (for typical plot commands -- I am not interested in other types of graphs/images). So, is this a known limitation of the new style graphics, or is there another way to stack multiple axes on top of each and see through all of them?
Thanks for the help.

Accepted Answer

Benjamin Kraus
Benjamin Kraus on 11 Nov 2020
This behavior of uiaxes has changed in MATLAB R2020b.
If you check the release notes for R2020b:
BackgroundColor property of UIAxes has no effect
Behavior change
Setting the BackgroundColor property on a UIAxes object no longer has any effect. The area around the plot box is transparent regardless of the value of the BackgroundColor property.
To produce the same effect as setting the background color in previous releases, create a panel with the desired BackgroundColor value, and then place the UIAxes in the panel.
J. Alex Lee
J. Alex Lee on 12 Nov 2020
Oh right, I forgot about the Color vs BackgroundColor...touche.
So the relevant update in 2020b is not the obsolecence of BackgroundColor, but finally the addition of the Color property! Great news!

Sign in to comment.

More Answers (4)

J. Alex Lee
J. Alex Lee on 12 Jan 2020
It is possible to create a regular "axes" within a "uifigure". Can you try that and see if you can accomplish what you need? This gives the advantage that it preserves ui interactions like buttondownfcn, where uiaxes still does not.
I read in some tmw community thing (can't remember what) that uiaxes was just a wrapper for an axes in a uipanel.

Apostolos Rigopoulos
Apostolos Rigopoulos on 14 Jan 2020
Well, yes your suggestion works. What I don't know is whether the axes object is considered to be part of the new-style html-based graphics. If it is not, then that would indicate that at some future release the axes object will no longer be supported. And if axes is part of the "new" graphics, then why would anyone use uiaxes that appears to have less functionality than axes? True, adding an axes oject into a uifigure does not generate a warning in the Matlab command window -- unlike attempting to add activex controls using a javacomponent command, which fails with Matlab stating that adding components this way on a uifigure is not supported and that this command will be removed from a future release.
So, what does using a uifigure with axes in it make the application? "New" html-based style, "old" java-based, or some type of (possibly nasty) hybrid?
I've seen statements by Mathworks that it intends to remove GUIDE from a future Matlab release -- I suspect in 2020. Now, that doesn't mean that support for the "old" style graphics will go away any time soon, but it does mean that there will be stronger push to use the new non-Java based style graphics to build any new applications. What I find surprising (and as I found out I am only the last one in a long list of other users/contributors) is that the new set of graphics objects do not provide at least the same functionality as the old ones (you mentioned, for instance, the lack of events in the uiaxes object). I suspect that as new Matlab versions come out, there will be more features, but they are not here right now. So, transitioning to the new style graphics now, while keeping the existing functionality, may not be possible.
J. Alex Lee
J. Alex Lee on 11 Nov 2020
Benjamin, thanks for clarifying that it is safe to use axes in the html-styled apps!
I haven't checked in 2020b, but as of 2019b, the appdesigner does complain when it seems plot-like commands with a first argument that isn't a uiaxes.

Sign in to comment.

Martin Dunda
Martin Dunda on 23 Mar 2020
Ah thanks you started this topic, I investigated today how much efforit it would be changing to App Designer and I pretty fast came to this limitation which prevents me from moving my GUIs. I am on R2019b and just looked in the R2020 changelog but couldn't find anything. Has anyone tried if that prbolem still persists with R2020a?
J. Alex Lee
J. Alex Lee on 24 Mar 2020
Yea, I'm also uneasy and a bit frustrated at TMW's tight control over seemingly benign or straightforward properties, but I don't pretend to know all the considerations!
Another work-around could be to expose the underlying object of the uiaxes
uax = uiaxes();
S = struct(uax);
ax = S.Axes % or S.Axes_I? they seem to be the same...
ax.Color = "none"
seems to work. I'm sure this is just as "forward incompatible" as the other option, but at least you get to keep your UIAxes and all its features/capabilities as well. I'm no expert, but it seems more likely to produce conflicts when you want to mix and match features/capabilities of both at the same time.

Sign in to comment.

Qun HAN on 10 Jun 2020
It's not wise to abandon GUIDE when the new APP Desinger is still so immature. New components related to the uifigure have many different propertie names and different behavor, like the one menthioned in this post. It's VERY frastrating to use Figure in MATLAB and UIFigure in APP Desinger. The two sets of graphics ought to be unified in the future.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!