poster
2019-12-10, 16:49
我正在尝试使用标有'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 其中polarlabel的定义如下:
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)]};
回答:
更新:此解决方案主要适用于R2014a和更早的版本,因为它对于新版本(尤其是使用新的手柄图形系统的 (https://www.mathworks.com/products/matlab/matlab-graphics.html) R2014b和较新版本)似乎失败。对于使用新手柄图形系统的新版本,可以在此处 (https://stackoverflow.com/q/30011448/52738)找到解决方案。
出于某种奇怪的原因,MATLAB中的数据光标工具会 (https://www.mathworks.com/help/matlab/ref/datacursormode.html)强制设置数据提示文本以文字形式显示,而不是使用TeX / LaTeX解释(即使默认的MATLAB设置 (https://www.mathworks.com/help/matlab/ref/text-properties.html#property_d0e1002285)是这样做的)。似乎也没有办法通过数据光标模式对象属性直接设置文本属性。
但是,我已经找到一种解决方法。如果将以下内容添加到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 说明
图中创建的每个图形对象都必须具有一个句柄 (https://www.mathworks.com/help/matlab/learn_matlab/understanding-handle-graphics-objects.html) 。对象有时会将其'HandleVisibility'属性 (https://www.mathworks.com/help/matlab/ref/text-properties.html#property_d0e1005510)设置为'off' ,因此它们的句柄将不会显示在其父对象的子对象列表中,因此很难找到它们。解决此问题的一种方法是将根对象 (https://www.mathworks.com/help/matlab/ref/groot.html)的'ShowHiddenHandles'属性 (https://www.mathworks.com/help/matlab/ref/root-properties.html#property_d0e877586)设置为'on' 。然后,这将允许您使用findobj (https://www.mathworks.com/help/matlab/ref/findobj.html)查找具有某些属性的图形对象的句柄。 ( 注意:您也可以使用findall (https://www.mathworks.com/help/matlab/ref/findall.html)而不用担心'ShowHiddenHandles'设置)
打开数据光标模式 (https://www.mathworks.com/help/matlab/ref/datacursormode.html)并单击图将创建一个hggroup对象 (https://www.mathworks.com/help/matlab/ref/hggroup.html) ,其中一个子对象 (https://www.mathworks.com/help/matlab/ref/text.html)是所显示文本的文本对象 (https://www.mathworks.com/help/matlab/ref/text.html) 。上面的代码找到此文本对象,并将'Interpreter'属性 (https://www.mathworks.com/help/matlab/ref/text-properties.html#property_d0e1002285)更改为'tex'以便正确显示theta符号。
从技术上讲,上面的代码只需调用一次,而不是每次调用polarlabel 。但是,直到您第一次单击绘图以显示数据提示时(即第一次polarlabel ),文本对象才存在,因此代码必须在UpdateFcn中输入数据光标模式对象,因此所显示的第一个数据提示具有正确的文本格式。
更多&回答... (https://stackoverflow.com/questions/1668071)
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 其中polarlabel的定义如下:
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)]};
回答:
更新:此解决方案主要适用于R2014a和更早的版本,因为它对于新版本(尤其是使用新的手柄图形系统的 (https://www.mathworks.com/products/matlab/matlab-graphics.html) R2014b和较新版本)似乎失败。对于使用新手柄图形系统的新版本,可以在此处 (https://stackoverflow.com/q/30011448/52738)找到解决方案。
出于某种奇怪的原因,MATLAB中的数据光标工具会 (https://www.mathworks.com/help/matlab/ref/datacursormode.html)强制设置数据提示文本以文字形式显示,而不是使用TeX / LaTeX解释(即使默认的MATLAB设置 (https://www.mathworks.com/help/matlab/ref/text-properties.html#property_d0e1002285)是这样做的)。似乎也没有办法通过数据光标模式对象属性直接设置文本属性。
但是,我已经找到一种解决方法。如果将以下内容添加到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 说明
图中创建的每个图形对象都必须具有一个句柄 (https://www.mathworks.com/help/matlab/learn_matlab/understanding-handle-graphics-objects.html) 。对象有时会将其'HandleVisibility'属性 (https://www.mathworks.com/help/matlab/ref/text-properties.html#property_d0e1005510)设置为'off' ,因此它们的句柄将不会显示在其父对象的子对象列表中,因此很难找到它们。解决此问题的一种方法是将根对象 (https://www.mathworks.com/help/matlab/ref/groot.html)的'ShowHiddenHandles'属性 (https://www.mathworks.com/help/matlab/ref/root-properties.html#property_d0e877586)设置为'on' 。然后,这将允许您使用findobj (https://www.mathworks.com/help/matlab/ref/findobj.html)查找具有某些属性的图形对象的句柄。 ( 注意:您也可以使用findall (https://www.mathworks.com/help/matlab/ref/findall.html)而不用担心'ShowHiddenHandles'设置)
打开数据光标模式 (https://www.mathworks.com/help/matlab/ref/datacursormode.html)并单击图将创建一个hggroup对象 (https://www.mathworks.com/help/matlab/ref/hggroup.html) ,其中一个子对象 (https://www.mathworks.com/help/matlab/ref/text.html)是所显示文本的文本对象 (https://www.mathworks.com/help/matlab/ref/text.html) 。上面的代码找到此文本对象,并将'Interpreter'属性 (https://www.mathworks.com/help/matlab/ref/text-properties.html#property_d0e1002285)更改为'tex'以便正确显示theta符号。
从技术上讲,上面的代码只需调用一次,而不是每次调用polarlabel 。但是,直到您第一次单击绘图以显示数据提示时(即第一次polarlabel ),文本对象才存在,因此代码必须在UpdateFcn中输入数据光标模式对象,因此所显示的第一个数据提示具有正确的文本格式。
更多&回答... (https://stackoverflow.com/questions/1668071)