MATLAB自定义数据提示图像

时间:2016-03-08 11:38:31

标签: matlab matlab-figure

按照其他页面上的说明进行操作,例如

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 ),我都希望获得“正常”图像数据提示:

image datatip

即。上有索引/ RGB信息。如何修改回调函数以获取此行为?

编辑:我想修改我的自定义回调,以便在我在图像上使用数据提示时自动显示类似于默认MATLAB默认数据提示的内容

1 个答案:

答案 0 :(得分:4)

要完成此操作,您可以检查event_obj.Target的类型并做出相应的响应。

get(event_obj.Target, 'type')

所有图片(imagescimageimshow)都会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)的正确显示。

enter image description here