#author("2019-07-07T00:20:27+09:00","default:Miyashita","Miyashita")
#author("2019-10-10T16:42:25+09:00","default:Miyashita","Miyashita")
*Figure全般に関するメモ [#g55908c0]
#contents
**現在のFigureの個数を取得 [#r96c1196]
-取得方法~
#codeprettify(lang-matlab){{
fh = findobj(0,'Type','Figure');
nfig = size(fh,1);
}}
1行目で生成されている Figure 全てのハンドルが fh になり,その長さを取得することで数がわかる.~
~
-ハンドルの再設定~
figure したのにハンドルを付け忘れた時は,上記で取得したfhを使って,
#codeprettify(lang-matlab){{
figA = fh(1);
}}
とすれば,Figure1 固有の Figure ハンドルになる.~
~

**Figureウィンドウの表示位置変更 [#mab3e2c5]
厳密に位置を指定したいときは,Position プロパティをいじる.~
#codeprettify(lang-matlab){{
p = get(gcf,'Position');
% 左端を left, 下端を bottom に,幅と高さは変更なし
set(gcf,'Position',[left bottom p(3) p(4)])
}}
Figure の Position には, [left bottom width height] が入る.~
上記はウィンドウのサイズはそのままに,位置だけを変える.~

他のウィンドウと重ならなければ問題ない程度であれば,movegui を使うのが楽.
#codeprettify(lang-matlab){{
movegui(fig1,'northeast')
movegui(fig2,'southeast')
movegui('west') 
}}
figure ハンドルを指定しない場合は gcf が対象.~
~

**Figureウィンドウのサイズ変更 [#xf0fb5e5]
-表示スクリーンに応じた最大サイズの取得~
subplot を使うとき,縦長や横長のグラフを作成するときなどに.~
使用しているディスプレイによって表示可能なサイズが変わるので,まずは最大サイズを取得する.
#codeprettify(lang-matlab){{
scrsz = get(groot,'ScreenSize');
maxW = scrsz(3);
maxH = scrsz(4);
}}
groot は root のグラフィックスオブジェクト.何かを格納する変数ではないので注意.~
~
-ウィンドウのサイズ変更~
あとはこの表示可能な最大サイズを上回らないように,適当に係数でもつけて幅と高さを変える.~
デフォルトの大きさに対する幅の倍率を nw,高さの倍率を nh とすれば,
#codeprettify(lang-matlab){{
figure;
p = get(gcf,'Position');
dw = p(3)-min(nw*p(3),maxW);
dh = p(4)-min(nh*p(4),maxH);
set(gcf,'Position',[p(1)+dw/2  p(2)+dh  min(nw*p(3),maxW)  min(nh*p(4),maxH)])
}}
で設定できる.~
Position プロパティの width と height だけを変えるとウィンドウが見えなくなるので,サイズの変更に応じて表示基準点も変える方がベター.~
eps 形式で figure を保存するときは,PaperPosition も設定しないとおかしくなる?みたい.~
~

**Figureの一部を削除 [#ddde577d]
for や while でループを使って何回も描画し,軸・色・ラベル・タイトル等を毎回設定するのは時間が勿体無い.~
ラベル等はそのままに,pcolor や surf で描いたものだけ消したい場合は,delete に消したいハンドルオブジェクトを入力する.~
下記は,2回目以降 pcolor 以外はそのままに pcolor を書き直す例.
#codeprettify(lang-matlab){{
for k = 1:n
  if exist('h','var'); delete(h); end; % hが変数として存在していれば実行
  h = pcolor(X,Y,C(:,:,k))
  ... 
  ...
end
}}
~

**FigureオブジェクトからAxesの取得 [#vc80a603]
R2014 らへん以降のバージョンから,Figure や Axes,Colorbar などはオブジェクトになった. ~
#codeprettify(lang-matlab){{
ax = fig.CurrentAxes;
}}
のようにすることで,
#codeprettify(lang-matlab){{
figure(fig)
ax = gca;
}}
と同様にカレント Axes を取得できる.
figure(fig) をしないのでウィンドウが邪魔にならず,function の中で使うのに便利.

Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes