- When you call colormap with a plain string or simple function handle, colormap(ax1,'jet') or colormap(ax1,@jet), the colormap function produces a new colormap that matches the length of the current colormap in ax1.
- Inside imagesc, the call image(ax,cdata) is resetting the axes colormap. (I don't know if this is expected behavior. I'll ask the MATLAB Graphics team about that. Edit: see my comment below.) Since the parent figure has an empty colormap, the reset axes colormap also becomes empty.
Axes in dialog box turn blank after calling imagesc in pushbutton callback
3 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Tomas Paliesek
il 30 Mar 2023
Commentato: Tomas Paliesek
il 30 Mar 2023
Question: Why axes in dialog box go blank after calling imagesc from pushbutton callback? I call first imagesc after creation of axes and this works. But when axes are to be updated pushing the button, they go blank. I checked cData property of axes image object and it changed everytime after pushing the button.
MWE:
Dlg();
function Dlg()
% dialog window
d = dialog('Name', 'Random image', 'Position', [100 100 400 200]);
% axes
ax1 = axes('parent', d, 'Position', [0.45 0.1 0.5 0.8]);
imagesc(ax1, randi(10,10))
colormap(ax1, 'jet')
% pushbutton
uicontrol('Parent', d, 'Style', 'pushbutton', 'Position', [20, 130, 100, 50], ...
'String', 'Imagesc', 'Callback', @BtnPushed)
% pushbtn callback
function BtnPushed(~, ~)
imagesc(ax1, randi(10,10))
colormap(ax1, 'jet')
end
end
Thanks for explanation.
0 Commenti
Risposta accettata
Steve Eddins
il 30 Mar 2023
Modificato: Steve Eddins
il 30 Mar 2023
This is a strange one. The primary trigger for the unusual behavior is that the dialog function creates a figure with an empty colormap (0x3), unlike normal figures, which have a default colormap that is 256x3.
Then there are two other interactions that matter:
Then, when the colormap function is called again by your callback function, the axes colormap has already been reset to 0x3, and so your colormap function is just producing another empty colormap.
I can think of two possible ways to change your implementation to avoid this behavior. First, you can change your calls to colormap to this: colormap(ax1, jet(256)).
Alternatively, you can revise your callback function to update the CData property of the existing image object, instead of calling imagesc to create a new up. Here's how that would look.
Dlg();
function Dlg()
% dialog window
d = dialog('Name', 'Random image','Position', [100 100 400 200]);
% axes
ax1 = axes('parent', d, 'Position', [0.45 0.1 0.5 0.8]);
im = imagesc(ax1, randi(10,10));
colormap(ax1, 'jet')
% pushbutton
uicontrol('Parent', d, 'Style', 'pushbutton', 'Position', [20, 130, 100, 50], ...
'String', 'Imagesc', 'Callback', @BtnPushed)
% pushbtn callback
function BtnPushed(~, ~)
im.CData = randi(10,10);
end
end
2 Commenti
Steve Eddins
il 30 Mar 2023
To follow up on the question I raised above, about imagesc(ax,A) resetting the axes colormap --
High-level graphics commands, such as imagesc, are expected to reset axes properties and delete existing axes children, unless you precede that call with something like hold on.
Più risposte (1)
Adam Danz
il 30 Mar 2023
Modificato: Adam Danz
il 30 Mar 2023
TL;DR Fix it by specifying the number of colors in jet()
function BtnPushed(~, ~)
imagesc(ax1, randi(10,10))
colormap(ax1, jet(256)) % <-----
end
What's happening
This stumped me for a bit. By default, figures produced by dialog have an empty colormap. When you specify a colormap using a string such as colormap(h,'jet'), it defines the number of colors in the colormap based on the figure's default colormap size. However, since dialog figures have an empty colormap, the colormap you're assigning is 0x3 which is no colormap at all. You can see that by calling,
colormap(ax1, 'jet')
size(ax1.Colormap)
> 0×3 empty double matrix
When you specify a colormap using an input argument, your colormap will have a non-zero height.
Another way this could have been fixed is by assigning a colormap to the dialog figure
d = dialog(__,'colormap',jet(256));
or by using a regular figure which has a non-empty default colormap and set to a modal WindowStyle to emulate dialog behavior.
d = figure('Name', 'Random image', 'Position', [100 100 400 200],'WindowStyle','modal')
Vedere anche
Categorie
Scopri di più su Orange in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!