问题:我使用MATLAB进行科学研究,而且我经常需要超过4位有效数字。每次我在图形的GUI中使用Data Cursor
时,我需要手动右键单击点Select Text Update Function...
或Edit Text Update Function...
,然后导航到我保存函数的文件夹,其回调打印超过4(例如8)个有效数字。这很烦人,应该有办法自动更改它。
理想的答案:我希望永久完成所有数字,例如:在一个更改我的startup.m
文件中的默认设置的函数中。
足够好的答案:我想要一个包装的函数,我给出了图形处理,它为我修复了这个问题。
我谦卑地等待着无限的智慧。
永久解决方案
将编辑default_getDatatipText.m
函数。您可以在以下位置找到它:
C:\...\MATLAB\R20xxx\toolbox\matlab\graphics\@graphics\@datacursor
在那里你会找到这条线:
DEFAULT_DIGITS = 4; % Display 4 digits of x,y position
根据需要进行编辑,不会造成太大的伤害,但如果需要,可以进行备份。
替代方案:
还有可能提供自定义数据提示:Tutorial at Matlab Central
它最终可能看起来像这样:
(数据提示之外的其他文本已经过后处理)
当你谈论精确度时。数据提示始终捕捉到最接近的数据点。它没有显示点击位置的插值数据。
由thewaywewalk给出的永久性答案在R2015a中不再有效,可能在以后的时间里也不再有效。所以我在这里分享我的临时和永久解决方案的解决方案
临时解决方案(单个数字):
以下函数包含作为嵌套函数的更新函数。调用datacursorextra
将其应用于当前数字,或datacursorextra(fig)
将其应用于某些数字fig
。
function datacursorextra(fig)
% Use current figure as default
if nargin<1
fig = gcf;
end
% Get the figure's datacursormode, and set the update function
h = datacursormode(fig);
set(h,'UpdateFcn',@myupdatefcn)
% The actual update function
function txt = myupdatefcn(~,event)
% Short-hand to write X, Y and if available Z, with 10 digit precision:
lbl = 'XYZ';
txt = arrayfun(@(s,g)sprintf('%s: %.10g',s,g), lbl(1:length(event.Position)), event.Position,'uniformoutput',false);
% If a DataIndex is available, show that also:
info = getCursorInfo(h);
if isfield(info,'DataIndex')
txt{end+1} = sprintf('Index: %d', info.DataIndex);
end
end
end
永久解决方案(默认适用于所有数字):
我还没有找到为数据光标设置默认UpdateFcn
的方法,但是可以添加一些代码,每次创建新图形时都会调用这些代码。将以下行添加到startup.m
:
set(0,'defaultFigureCreateFcn',@(s,e)datacursorextra(s))
并确保您的Matlab路径中提供了上面给出的datacursorextra
函数。
@ caspar的解决方案非常有效。您还可以使用更新解决方案的txt {}部分
if isfield(info,'DataIndex')
DataIndex = [info.DataIndex];
txt{end+1} = sprintf('Index: %d\n', DataIndex(1));
end
这将使您在同一图中有多个指针时更新索引字段。