Настроить курсор данных для 3D-объектов

Скажем, у меня есть много сфер, нарисованных с помощью функции серфинга / сетки в MATLAB.

Я хочу отображать настраиваемые значения данных, а не x,y,z. Все значения будут разными для разных сфер, и щелчок по любой точке на конкретной сфере должен отображать одни и те же данные. См. Рисунок. Как мне этого добиться?

Пока что я думаю об использовании "тега" свойства Surface для присвоения уникальной строки каждой сфере. Есть ли лучший способ сделать это?

[x,y,z] = sphere;
a=[3 1 3 1];
s1=surf(x*a(1,4)+a(1,1),y*a(1,4)+a(1,2),z*a(1,4)+a(1,3),...
        'FaceColor', [1 0 0],'FaceLighting','flat','EdgeColor','none');
s1.Tag = '1';

Как мне продолжить работу с пользовательской функцией курсора данных для пользовательской функциональности?

1 ответ

Решение

Функция datacursor является атрибутом figure, поэтому фокус состоит в том, чтобы присвоить фигуре функцию обновления подсказки.

Размещение пользовательской информации для каждой сферы / графического объекта в своем Tag недвижимость - хорошая идея для того, чего вы хотите достичь.

Давайте сначала определим функцию обновления. Сохраните следующий файл вdatatip_sphere.m и убедитесь, что он виден на пути Matlab:

function output_txt = datatip_sphere(~,event_obj)
% Display the tag of the cursor target
% obj          Currently not used (empty)
% event_obj    Handle to event object
% output_txt   Data cursor text string (string or cell array of strings).

output_txt = { event_obj.Target.Tag };

Вооружившись этим, теперь давайте нарисуем две сферы и убедимся, что функция курсора отображает то, что вы хотите:

% retrieve the handle of the figure used for sphere display
% (better than calling 'gca' in datacursormode(hfig)
hfig = figure ;

% Draw your objects
[x,y,z] = sphere;
a=[3 1 3 1] ;
b=[5 6 4 1] ;
s1 = surf(x*a(1,4)+a(1,1),y*a(1,4)+a(1,2),z*a(1,4)+a(1,3),...
        'FaceColor', [1 0 0],'FaceLighting','flat','EdgeColor','none','Facealpha',0.5);
hold on 
s2 = surf(x*b(1,4)+b(1,1),y*b(1,4)+b(1,2),z*b(1,4)+b(1,3),...
        'FaceColor', [0 0 1],'FaceLighting','flat','EdgeColor','none','Facealpha',0.5);
axis equal
    
% Add a tag to each object
s1.Tag = 'This is sphere 1';
s2.Tag = 'This is sphere 2';

% Now force the figure datatip function to your custom version
dcm = datacursormode(hfig) ;
dcm.UpdateFcn = @datatip_sphere ;

Очевидно, что важные строки - это последние 4 строки, в которых вы назначаете Tag для каждого вашего графического объекта, и особенно последних двух строк, в которых вы назначаете пользовательскую функцию обновления курсора рисунку.


Отлично, теперь ваша подсказка всегда будет отображать имя / тег, присвоенный объекту, независимо от их положения:

Другие вопросы по тегам