为 3D 对象自定义数据光标
Customize data cursor for 3D objects
比方说,我在 MATLAB 中用 surf/mesh 函数绘制了很多球体。
我想显示自定义数据值而不是 x,y,z。不同球体的所有值都将不同,单击特定球体上的任何点应显示相同的数据。参考图。如何实现?
到目前为止,我正在考虑使用 Surface 属性 'tag' 为每个球体分配唯一的字符串。有没有更好的方法呢?
[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';
我应该如何使用自定义数据光标函数来实现自定义功能?
datacursor 函数是 figure
的属性,所以诀窍是将数据提示更新函数分配给图形。
将每个 sphere/graphic 对象的自定义信息放在其 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
,特别是最后两行,您将自定义光标更新函数分配给图形。
太棒了,现在您的数据提示将始终显示分配给对象的 name/tag,无论其位置如何:
比方说,我在 MATLAB 中用 surf/mesh 函数绘制了很多球体。
我想显示自定义数据值而不是 x,y,z。不同球体的所有值都将不同,单击特定球体上的任何点应显示相同的数据。参考图。如何实现?
到目前为止,我正在考虑使用 Surface 属性 'tag' 为每个球体分配唯一的字符串。有没有更好的方法呢?
[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';
我应该如何使用自定义数据光标函数来实现自定义功能?
datacursor 函数是 figure
的属性,所以诀窍是将数据提示更新函数分配给图形。
将每个 sphere/graphic 对象的自定义信息放在其 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
,特别是最后两行,您将自定义光标更新函数分配给图形。
太棒了,现在您的数据提示将始终显示分配给对象的 name/tag,无论其位置如何: