Как использовать форматирование 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)]};

person Doresoom    schedule 03.11.2009    source источник


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

person gnovice    schedule 03.11.2009