web-dev-qa-db-ja.com

MATLAB:ロードされたFigureのラインプロパティを変更しますか?

MATLABユーザー向けの非常に簡単な質問があります。

Loadコマンドを使用してFigureファイル(.fig)をロードする場合、コマンドラインからプロットされた線のプロパティを変更する方法はありますか? (幅、色、マーカーなど)

PD:このページでプロットする線の色を定義する…の情報による最初の2つのオプションは、次の場合にのみ機能します。 plotコマンドを使用します。どうやら、フィギュアをロードしても役に立たないようです。

13
aarelovich

[〜#〜] findobj [〜#〜] 関数を使用して、現在のFigureのすべてのラインオブジェクトのハンドルを取得できます。

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','*') 
17
yuk

フィギュア内のオブジェクトを操作するには、それらのハンドルにアクセスできる必要があります。プロット関数を使用して図形を作成すると、ハンドルが返されます。フィギュアを開くときは、あなたの場合と同様に、グラフィックオブジェクトツリーをたどって、操作する特定の要素へのハンドルを見つける必要があります。

このページ グラフィックオブジェクトの構造に関する情報があります。

必要なハンドルへのパスはフィギュアによって異なりますが、例として、フィギュアが単純なplotコマンドを使用して作成された場合、これはラインプロパティを変更する1つの方法です。

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
foglerit

@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

これは、凡例を特定の場所に配置する必要がある場合などには適さない場合があります。

2
Vairis

ビューアの行を右クリックして、そこでプロパティを変更することもできます。これにより、対応する「凡例」エントリも変更されます(少なくとも2014bでは変更されます)。

0
SeanNZ