Как использовать форматирование TeX/LaTeX для пользовательских подсказок данных в MATLAB?
Я пытаюсь аннотировать полярный график подсказками данных, помеченными буквой "R:...,Theta:...", где theta на самом деле является греческим символом, а не прописанным словом. Я знаком с форматированием строк с использованием '\ theta', в результате чего получается символ, но в этом случае он не работает. Есть ли способ применить интерпретатор LaTeX к подсказкам данных? Вот что у меня так далеко:
f1=figure;
t=pi/4;
r=1;
polar(t,r,'.');
dcm_obj = datacursormode(f1);
set(dcm_obj,'UpdateFcn',@polarlabel)
info_struct = getCursorInfo(dcm_obj);
datacursormode on
где полярная метка определяется следующим образом:
function txt = polarlabel(empt,event_obj)
pos = get(event_obj,'Position');
x=pos(1);
y=pos(2);
[th,r]=cart2pol(x,y);
txt = {['R: ',num2str(r)],...
['\Theta: ',num2str(th*180/pi)]};
1 ответ
Обновление: Это решение в первую очередь применимо к версиям R2014a и более ранним версиям, поскольку, как представляется, оно выходит из строя для более новых версий, в частности R2014b и более новых, использующих новую графическую систему с ручкой. Для более новых версий, использующих новую ручную графическую систему, решение можно найти здесь.
По какой-то странной причине инструмент курсора данных в MATLAB принудительно устанавливает текст подсказки данных, который будет отображаться буквально, а не с интерпретацией TeX/LaTeX (даже если в настройках MATLAB по умолчанию это указано). Также, похоже, нет способа напрямую установить свойства текста через свойства объекта режима курсора данных.
Тем не менее, я нашел один обходной путь. Если вы добавите следующее в конце вашего polarlabel
функция, текст должен отображаться правильно:
set(0,'ShowHiddenHandles','on'); % Show hidden handles
hText = findobj('Type','text','Tag','DataTipMarker'); % Find the data tip text
set(0,'ShowHiddenHandles','off'); % Hide handles again
set(hText,'Interpreter','tex'); % Change the interpreter
объяснение
Каждый графический объект, созданный на рисунке, должен иметь дескриптор. Объекты иногда имеют свои 'HandleVisibility'
свойство установлено в 'off'
поэтому их дескрипторы не будут отображаться в списке дочерних объектов для их родительского объекта, что затруднит их поиск. Одним из способов решения этой проблемы является установка 'ShowHiddenHandles'
свойство корневого объекта 'on'
, Это позволит вам использовать findobj
найти дескрипторы графических объектов с определенными свойствами. (Примечание: вы также можете использовать findall
и не беспокоиться о 'ShowHiddenHandles'
установка)
При включении режима курсора данных и щелчке по графику создается объект hggroup, одним из дочерних объектов которого является текстовый объект для отображаемого текста. Приведенный выше код находит этот текстовый объект и изменяет 'Interpreter'
собственность на 'tex'
так что символ тета отображается правильно.
Технически, приведенный выше код должен вызываться только один раз, а не каждый раз polarlabel
называется. Тем не менее, текстовый объект не существует до тех пор, пока вы в первый раз не нажмете на график, чтобы вызвать подсказку данных (т.е. в первый раз polarlabel
вызывается), поэтому код должен идти в UpdateFcn
для объекта режима курсора данных, так что первый отображаемый наконечник данных имеет правильное форматирование текста.