web-dev-qa-db-ja.com

Matlab:FigureハンドルのすべてのAxesハンドルを取得する方法は?

FigureハンドルのすべてのAxesハンドルを取得するにはどうすればよいですか?

図のハンドルhfを考えると、get(hf, 'children')がすべての軸のハンドルを返す可能性があることがわかりました。ただし、Matlabヘルプでは、Axesハンドルだけでなく、それ以上を返すことを提案しています。

図の子供。 Figure内に表示されるすべての軸、ユーザーインターフェイスオブジェクトのハンドルを含むベクトル。ハンドルの順序を変更して、ディスプレイ上のオブジェクトのスタックを変更できます。

フィギュアハンドルで軸ハンドルのみを取得する方法はありますか?または、get(hf, 'children')によって返されたハンドルがaxハンドルであるかどうかを知るにはどうすればよいですか?

ありがとう!

35
YYC

[〜#〜] findall [〜#〜] を使用します。

allAxesInFigure = findall(figureHandle,'type','axes');

Matlabの任意の場所ですべてのAxesハンドルを取得したい場合は、以下を実行できます。

allAxes = findall(0,'type','axes');

[〜#〜] edit [〜#〜]

質問の2番目の部分に答えるには、handles typeプロパティを取得して、ハンドルのリストが軸であるかどうかをテストします。

isAxes = strcmp('axes',get(listOfHandles,'type'));

isAxesは、axes型のすべてのハンドルに対してtrueになります。

EDIT2

凡例ではない軸ハンドルのみを選択するには、軸のリストをクリーンアップする必要があります('legend'または'Colorbar'ではないタグを持つすべてのハンドルを削除して、axハンドル:

axNoLegendsOrColorbars= ax(~ismember(get(ax,'Tag'),{'legend','Colobar'}))
37
Jonas

「Jonas」と「tm1」には、一部で有効な答えがあります。ただし、tm1が問題を指摘したように、タイプ 'axes'にはいくつかの項目があります。

凡例または軸自体を正確に参照するには(他のアイテムが存在する場合があります)、それらの特性を使用してそれらを区別する必要があります。

この例では、「プロパティエディター」を開き、軸と凡例の異なるプロパティを探しました(どちらも「type、axes」に属しているため)。私は軸とその凡例をコピーしようとしました:

copied_axes = findobj(temp_fig,'type','axes','Tag','');
copied_legend = findobj(temp_fig,'type','axes','Tag','legend');

「Tag」プロパティの代わりに、「Property Inspector」の他のプロパティを使用することもできます。事は、それらは異なっていなければならないということです。それらのプロパティのほとんどは同じです。

2

伝説を参照するハンドルがいくつかあったため、Jonasのソリューションはうまくいきませんでした。驚いたことに、少なくともMatlab 2010aでは、凡例は軸として実装されているようです。凡例やその他のものではなく、軸のみが必要な場合のソリューションを次に示します。

axesHandles = get(fig, 'Children');
classHandles = handle(axesHandles);
count = length(axesHandles);
isNotInstanceOfSubtype = false(1, count);
for i = 1:count
    isNotInstanceOfSubtype(i) = strcmp(class(classHandles(i)), 'axes') == 1;
end
axesHandles = axesHandles(isNotInstanceOfSubtype);

このスクリプトは、scribe.legendなど、タイプAxesのサブタイプであることが明らかになるハンドルをソートすることで機能します。

上記のコードスニペットを改善しようとしている人への警告:次のようなものを使用します

classHandles = cellfun(@(x) handle(x), axesHandles)

意図したとおりに機能しない場合があります。

??? Error using ==> cellfun
scribe.legend type is not currently implemented.
2
tm1

@ tm1によるソリューションは優れています。私はもう少し複雑ではありません(関数型プログラミングでよければ):

% initialize `fig` somehow, i.e., "fig=gcf()" for the current figure or
% "fig=get(0,'children')" for all open figures; can be vector or scalar.

ax = findall(fig, 'type', 'axes');
ax = ax(arrayfun(@(i) strcmp(class(handle(i)), 'axes'), ax));

axには、プロット軸のみが含まれます。これは、凡例またはカラーバーオブジェクトのclassaxesと異なるために機能します。

編集 @Jonasは、少なくとも凡例とカラーバーに空でないfindallプロパティがあるように見えるため、Tagの結果をフィルタリングする潜在的な改善を指摘しています。上記のコードスニペットの行

ax = ax(strcmp('', get(ax, 'Tag')))

これらの手法は両方とも気味が悪く、将来壊れる可能性があります(ggplot2またはBokehとの比較は興味深いかもしれません)。

2
Ahmed Fasih