Как использовать форматирование 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 для объекта режима курсора данных, так что первый отображаемый наконечник данных имеет правильное форматирование текста.

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