MATLAB:更改已加载图形的线属性?

时间:2012-02-17 14:01:59

标签: matlab plot edit matlab-figure

对于MATLAB用户,我有一个非常简单的问题:

如果我使用load命令加载图形文件(.fig),有没有办法从命令行更改绘制的线条属性? (宽度,颜色,标记等)

PD:根据 Defining the Color of Lines for Plotting On this page… 中的信息,前两个选项仅在使用plot命令时才有效。显然,如果加载数字,它们就没用了。

4 个答案:

答案 0 :(得分:17)

您可以使用FINDOBJ函数获取当前图形上所有线对象的句柄:

hline = findobj(gcf, 'type', 'line');

然后你可以改变所有线对象的一些属性:

set(hline,'LineWidth',3)

或仅针对其中一些人:

set(hline(1),'LineWidth',3) 
set(hline(2:3),'LineStyle',':') 
idx = [4 5];
set(hline(idx),'Marker','*') 

答案 1 :(得分:2)

为了操纵图形中的对象,您需要访问其句柄。如果使用绘图函数创建图形,这些将返回句柄。当您打开图形时,就像您的情况一样,您需要按照图形对象树来查找要操作的特定元素的句柄。

This page包含有关图形对象结构的信息。

您想要的句柄的路径将取决于您的图形,但是,作为示例,如果您的图形是使用简单的plot命令创建的,这将是更改线属性的一种方法:

x = 0:0.1:2;
plot(x,sin(x));

fig = gcf % get a handle to the current figure
% get handles to the children of that figure: the axes in this case
ax = get(fig,'children') 
% get handles to the elements in the axes: a single line plot here
h = get(ax,'children') 
% manipulate desired properties of the line, e.g. line width
set(h,'LineWidth',3)

答案 2 :(得分:2)

除@yuk回答外,如果你还有传奇

hline = findobj(gcf, 'type', 'line');

将返回N x 3行(或更确切地说 - lines plotted + 2x lines in legend)。 我将在此处仅查看绘制的所有线条也在图例中的情况。

测序很奇怪: 如果绘制了5行(让我们记下它们1 to 5)并添加了图例,那么您将拥有

hline:
1 : 5 th line (mistical)    
2 : 5 th line (in legend)
3 : 4 th line (mistical)    
4 : 4 th line (in legend)
5 : 3 th line (mistical)    
6 : 3 th line (in legend)
7 : 2 th line (mistical)    
8 : 2 th line (in legend)
9 : 1 th line (mistical)    
10: 1 th line (in legend)
11: 5 th line (in plot)
12: 4 th line (in plot)
13: 3 th line (in plot)
14: 2 th line (in plot)
15: 1 th line (in plot)

作为解决方案(星期五晚上拖延),我做了这个小宝贝:

解决方案1:如果您不想重置图例

检测是否有图例以及绘制了多少行:

hline = findobj(gcf, 'type', 'line');
isThereLegend=(~isempty(findobj(gcf,'Type','axes','Tag','legend')))

if(isThereLegend)
    nLines=length(hline)/3
else
    nLines=length(hline)
end

对于每一行找到正确的句柄并为该行执行操作(它也将应用于相应的图例行)

for iterLine=1:nLines
    mInd=nLines-iterLine+1
    if(isThereLegend)
        set(hline([(mInd*2-1) (mInd*2) (2*nLines+mInd)]),'LineWidth',iterLine) 
    else
    set(hline(mInd),'LineWidth',iterLine)     
    end
end

这会使每个i-th行与width=i对齐,在这里您可以添加自动更改属性;

解决方案2:保持简单

摆脱传奇,照顾线条,重置传奇。

legend off
hline = findobj(gcf, 'type', 'line');
nLines=length(hline)

for iterLine=1:nLines
    mInd=nLines-iterLine+1
    set(hline(mInd),'LineWidth',iterLine)     
end
legend show

这可能不适用于必须将图例放置在某个特定位置等的情况。

答案 3 :(得分:0)

您也可以右键单击查看器中的行,然后更改其中的属性。这也改变了相应的传奇'进入(至少在2014b)。