当颜色图改变时执行一个函数
Execute a function when the colormap changes
我正在开发一个 GUI 控件 MATLAB (2014a) 程序,其中的绘图 window 在基于 pcolor
的绘图之上显示了类似 contour
的绘图。
用户发现,colormap
可以通过右击颜色条来改变。但是,由于我的 contour
函数的内部结构,此更改只会直接影响 pcolor
图。
我已经找到了如何从我的轴对象中获取更改的 colormap
并将其应用于 contour
绘图,但我仍然需要手动重做该绘图。
一旦 axes
/ figure
对象的 colormap
改变,是否有任何回调执行?
我读到了 PropertyChangeCallback
,但是 colormap
似乎没有存储为 属性。
您不需要求助于未记录的 功能来拦截 Matlab pre-HG2 中的 colormap
更改。您可以简单地将侦听器附加到 属性 'Colormap'
.
的 'PostSet'
事件
举个简单的例子,如果你的数字已经存在,只需输入:
lh = addlistener( h.fig , 'Colormap' , 'PostSet' , @(h,e) disp('cmap changed !') )
在控制台中,每次更改 colormap
时都会收到一条消息。请注意,是否会触发事件:
- 您将
colormap
完全更改为另一个(例如,从 jet
到 hsv
)
- 您更改颜色图的大小(分割数)。 (例如:
colormap(jet(5))
)
- 您使用了“交互式颜色映射变换”GUI 工具。
请注意,如果您使用 caxis
,事件将 不会 触发。此命令不会更改 colormap
本身,但会更改某些颜色映射到它的方式。因此,如果您使用此命令,您的 pcolor
将被修改(尽管颜色图不会)。 caxis
命令更改当前 axes
的 CLim
属性(不是 figure
!)。所以如果你想检测到它,你必须在正确的轴上将一个监听器附加到这个 属性 上。类似于:
lh = addlistener( gca , 'CLim' , 'PostSet' , @(h,e) disp('clim changed !') )
作为一个更实用的示例,这里有一个小演示,它会在每次 colormap
更改时做出反应。由于我不知道您打算在每次更改时对 contour
图做什么,所以我只修改了几个属性以表明它正在做某事。将其调整为您需要做的。
function h = cmap_change_event_demo
%// SAMPLE DATA. create a sample "pcolor" and "contour" plot on a figure
nContour = 10 ;
[X,Y,Z] = peaks(32);
h.fig = figure ;
h.pcol = pcolor(X,Y,Z) ;
hold on;
[~,h.ct] = contour(X,Y,Z,nContour,'k');
h.cb = colorbar
shading interp
colormap( jet(nContour+1) ) %// assign a colormap with only 10+1 colors
%// add the listener to the "Colormap" property
h.lh = addlistener( h.fig , 'Colormap' , 'PostSet' , @cmap_changed_callback )
%// save the handle structure
guidata( h.fig , h )
function cmap_changed_callback(~,evt)
%// disp('cmap changed !')
hf = evt.AffectedObject ; %// this is the handle of the figure
cmap = evt.NewValue ; %// this is the new colormap. Same result than : cmap = get(hf,'Colormap') ;
h = guidata( hf ) ; %// to retrieve your contour handles (and all the other handles)
nColor = size(cmap,1) ; %// to know how many colors are in there if you want matching contours
%// or just do something useless
set(h.ct , 'LineColor' , rand(1,3) ) %// change line color
set(h.ct , 'LineWidth' , randi([1 5],1) ) %// change line thickness
我正在开发一个 GUI 控件 MATLAB (2014a) 程序,其中的绘图 window 在基于 pcolor
的绘图之上显示了类似 contour
的绘图。
用户发现,colormap
可以通过右击颜色条来改变。但是,由于我的 contour
函数的内部结构,此更改只会直接影响 pcolor
图。
我已经找到了如何从我的轴对象中获取更改的 colormap
并将其应用于 contour
绘图,但我仍然需要手动重做该绘图。
一旦 axes
/ figure
对象的 colormap
改变,是否有任何回调执行?
我读到了 PropertyChangeCallback
,但是 colormap
似乎没有存储为 属性。
您不需要求助于未记录的 功能来拦截 Matlab pre-HG2 中的 colormap
更改。您可以简单地将侦听器附加到 属性 'Colormap'
.
'PostSet'
事件
举个简单的例子,如果你的数字已经存在,只需输入:
lh = addlistener( h.fig , 'Colormap' , 'PostSet' , @(h,e) disp('cmap changed !') )
在控制台中,每次更改 colormap
时都会收到一条消息。请注意,是否会触发事件:
- 您将
colormap
完全更改为另一个(例如,从jet
到hsv
) - 您更改颜色图的大小(分割数)。 (例如:
colormap(jet(5))
) - 您使用了“交互式颜色映射变换”GUI 工具。
请注意,如果您使用 caxis
,事件将 不会 触发。此命令不会更改 colormap
本身,但会更改某些颜色映射到它的方式。因此,如果您使用此命令,您的 pcolor
将被修改(尽管颜色图不会)。 caxis
命令更改当前 axes
的 CLim
属性(不是 figure
!)。所以如果你想检测到它,你必须在正确的轴上将一个监听器附加到这个 属性 上。类似于:
lh = addlistener( gca , 'CLim' , 'PostSet' , @(h,e) disp('clim changed !') )
作为一个更实用的示例,这里有一个小演示,它会在每次 colormap
更改时做出反应。由于我不知道您打算在每次更改时对 contour
图做什么,所以我只修改了几个属性以表明它正在做某事。将其调整为您需要做的。
function h = cmap_change_event_demo
%// SAMPLE DATA. create a sample "pcolor" and "contour" plot on a figure
nContour = 10 ;
[X,Y,Z] = peaks(32);
h.fig = figure ;
h.pcol = pcolor(X,Y,Z) ;
hold on;
[~,h.ct] = contour(X,Y,Z,nContour,'k');
h.cb = colorbar
shading interp
colormap( jet(nContour+1) ) %// assign a colormap with only 10+1 colors
%// add the listener to the "Colormap" property
h.lh = addlistener( h.fig , 'Colormap' , 'PostSet' , @cmap_changed_callback )
%// save the handle structure
guidata( h.fig , h )
function cmap_changed_callback(~,evt)
%// disp('cmap changed !')
hf = evt.AffectedObject ; %// this is the handle of the figure
cmap = evt.NewValue ; %// this is the new colormap. Same result than : cmap = get(hf,'Colormap') ;
h = guidata( hf ) ; %// to retrieve your contour handles (and all the other handles)
nColor = size(cmap,1) ; %// to know how many colors are in there if you want matching contours
%// or just do something useless
set(h.ct , 'LineColor' , rand(1,3) ) %// change line color
set(h.ct , 'LineWidth' , randi([1 5],1) ) %// change line thickness