Как правильно отображать строки TeX в подсказках к осям? (MATLAB hg2)
Недавно я попытался запустить старый кусок кода (написанный на hg1) в новой версии MATLAB (2015a), которая имеет hg2.
Раньше я мог делать следующее (согласно методу gnovice- Amro):
function output_txt = customDatatip(~,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).
hFig = ancestor(event_obj.Target,'figure'); %// I don't trust gcf ;)
pos = get(event_obj,'Position');
output_txt = {['\lambda: ',num2str(pos(1)*1000,4) 'nm'],...
['T(\lambda): ',num2str(pos(2),4) '%']};
set(findall(hFig, 'Type','text', 'Tag','DataTipMarker'),...
'Interpreter','tex'); %// Change the interpreter
И получал бы красиво отформатированные метки подсказок с греческими символами.
Однако в новой системе hg2 findall
возвращает 0x0 empty GraphicsPlaceholder array
, который делает настройку Interpreter
бесполезный.
У меня вопрос: как я могу установить интерпретатор всплывающих подсказок для графика (La)TeX в hg2?
1 ответ
После некоторого копания с помощью uiinspect
Я обнаружил, что "TextBox"
теперь хранится как matlab.graphics.shape.internal.GraphicsTip
тип объекта внутри obj
"s TipHandle
свойство, которое, в свою очередь, имеет Interpreter
имущество! Оба свойства public
и может быть легко установлен с помощью точечной нотации. В итоге я использовал следующий код:
function output_txt = customDatatip(obj,event_obj)
% Display the position of the data cursor // <- Autogenerated comment
% obj Currently not used (empty) // <- Autogenerated comment, NO LONGER TRUE!
% event_obj Handle to event object // <- Autogenerated comment
% output_txt Data cursor text string (string or cell array of strings). // <- A.g.c.
hFig = ancestor(event_obj.Target,'figure');
pos = get(event_obj,'Position');
output_txt = {['\lambda: ',num2str(pos(1)*1000,4) 'nm'],...
['T(\lambda): ',num2str(pos(2),4) '%']};
if ishg2(hFig)
obj.TipHandle.Interpreter = 'tex';
else %// The old version, to maintain backward compatibility:
set(findall(hFig, 'Type','text', 'Tag','DataTipMarker'),...
'Interpreter','tex'); % Change the interpreter
end
function tf = ishg2(fig)
try
tf = ~graphicsversion(fig, 'handlegraphics');
catch
tf = false;
end
Заметки:
- Первый вход в функцию (
obj
) больше не игнорируется, так как теперь имеет некоторое применение. -
ishg2
функция взята из этого MATLAB Ответ.
Edit1:
Только что заметил, что есть еще один способ проверить версию графики MATLAB (т.е. hg1/hg2), используя следующий код, который я нашел в наборе инструментов вейвлета:
function bool = isGraphicsVersion2
%//isGraphicsVersion2 True for Graphic version 2.
%// M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 21-Jun-2013.
%// Last Revision: 04-Jul-2013.
%// Copyright 1995-2013 The MathWorks, Inc.
%// $Revision: 1.1.6.1 $ $Date: 2013/08/23 23:45:07 $
try
bool = ~matlab.graphics.internal.isGraphicsVersion1;
catch
bool = ~isprop(0,'HideUndocumented');
end