按照其他页面上的说明进行操作,例如
http://blogs.mathworks.com/videos/2011/10/19/tutorial-how-to-make-a-custom-data-tip-in-matlab/ http://it.mathworks.com/help/matlab/ref/datacursormode.html http://it.mathworks.com/matlabcentral/answers/68079-how-to-add-additional-info-to-the-data-cursor
我已经为数据提示编写了一个自定义回调函数,以显示x-y图上的点的索引以及它们的x和y坐标:
String[]
此代码从MATLAB建议的默认回调开始,并在绘图为3D时添加z坐标信息。由于我经常需要知道图上某点的数组索引,因此在MATLAB启动时会自动启用自定义回调函数。
现在,无论何时我绘制图像(例如通过function output_txt = customCallback_DataTip(obj,event_obj)
% Display the position of the data cursor
% obj Currently not used (empty)
% event_obj Handle to event object
% output_txt Data cursor text string (string or cell array of strings).
pos = get(event_obj,'Position');
output_txt = {['X: ',num2str(pos(1),4)],...
['Y: ',num2str(pos(2),4)]};
% If there is a Z-coordinate in the position, display it as well
if length(pos) > 2
output_txt{end+1} = ['Z: ',num2str(pos(3),4)];
else % 2D plot: write index of current point
i = find(event_obj.Target.XData == pos(1), 1);
output_txt{end+1} = ['i: ',num2str(i)];
end
),我都希望获得“正常”图像数据提示:
即。上有索引/ RGB信息。如何修改回调函数以获取此行为?
编辑:我想修改我的自定义回调,以便在我在图像上使用数据提示时自动显示类似于默认MATLAB默认数据提示的内容
答案 0 :(得分:4)
要完成此操作,您可以检查event_obj.Target
的类型并做出相应的响应。
get(event_obj.Target, 'type')
所有图片(imagesc
,image
或imshow
)都会Type
image
。
isImage = strcmpi(get(event_obj.Target, 'type'), 'image')
然后,您可以提取图像数据。如果您有索引图像,还可以获取色彩图以确定要进入数据提示的所有其他信息。
cdata = get(event_obj.Target, 'cdata');
cmap = colormap(ancestor(event_obj.Target, 'axes'));
将所有内容整合在一起,我会将您的自定义数据提示回调修改为类似的内容。
function output_txt = callback(obj, event_obj, clims)
% Get the cursor location
pos = get(event_obj, 'Position');
output_txt = {sprintf('[X,Y]: [%i, %i]', pos(1), pos(2))};
if strcmpi(get(event_obj.Target, 'type'), 'image')
% Get the image data
cdata = get(event_obj.Target, 'CData');
% Check to ensure pos is in range
if pos(1) < 1 || pos(1) > size(cdata, 2) || ...
pos(2) < 1 || pos(2) > size(cdata, 1)
rgb = {NaN, NaN, NaN};
newline = sprintf('[R,G,B]: [%0.4f %0.4f %0.4f]', rgb{:});
output_txt = cat(1, output_txt, newline);
return
end
% If the image is RGB
if size(cdata, 3) == 3
rgb = num2cell(cdata(pos(2), pos(1), :));
% If this is an indexed image
else
index = cdata(pos(2), pos(1));
% Figure out the colormap
hax = ancestor(event_obj.Target, 'axes');
cmap = colormap(hax);
% If the CData is scaled, we need to scale to the colormap
if strcmpi(get(event_obj.Target, 'CDataMapping'), 'scaled')
value = (index - clims(1)) * size(cmap, 1) / diff(clims);
else
value = index;
end
% Determine RGB value from colormap
rgb = num2cell(ind2rgb(round(value), cmap));
if round(index) == index
newline = sprintf('Index: %d', index);
else
newline = sprintf('Index: %.4f', index);
end
% Generate datatip text
output_txt = cat(1, output_txt, newline);
end
output_txt = cat(1, output_txt, ...
sprintf('[R,G,B]: [%0.4f %0.4f %0.4f]', rgb{:}));
% Otherwise we use your custom datatip for plots
else
index = find(event_obj.Target.XData == pos(1), 1);
pos = get(event_obj, 'Position');
output_txt = { sprintf('X: %0.4f', pos(1));
sprintf('Y: %0.4f', pos(2))};
% If there is a Z-coordinate in the position, display it as well
if length(pos) > 2
output_txt{end+1} = sprintf('Z: %0.4f', pos(3));
else % 2D plot: write index of current point
output_txt{end+1} = sprintf('i: %d', index);
end
end
end
如果您注意到,我将其他变量(clims
)传递给回调函数。这是因为某些版本实际上不允许我在数据提示UpdateFcn
内查询中的轴属性。所以这意味着你必须稍微改变你的UpdateFcn
匿名函数。
h = datacursormode(fig);
set(h, 'Enable', 'on')
% Here I have to pass the `clims` because I can't fetch them inside
set(h, 'UpdateFcn', @(dt,e)callback(dt, e, caxis(ancestor(dt.Host, 'axes'))));
使用此功能,我能够显示图形和图像(索引和RGB)的正确显示。