日記

日本語の勉強のためのブログ

【MATLAB】図中の2点を双方向矢印↔で結ぶ他

MATLABで2次元グラフを作成するにあたり、有益だった情報についてまとめる。

<目次>

とりあえずグラフを表示する

以下のコードをコピペするとsin波(0≦x≦2π)が表示される。

x = linspace(0, 2*pi, 1024);
y = sin(x);
plot(x, y)

グラフを点線で描画する

plot関数にグラフのデザインを引数として与えればよい。 具体的には以下のようにする。

x = linspace(0, 2*pi, 1024);
y = sin(x);
plot(x, y, '--')

ここでは引数'--'を与えて点線にしたが、ほかにも様々な線にできる。公式のリファレンスを参考にしてほしい。
https://jp.mathworks.com/help/matlab/ref/plot.html#btzitot_sep_mw_3a76f056-2882-44d7-8e73-c695c0c54ca8

軸目盛りの変更

軸目盛りをT, 2T, 3T, ... (T: 周期)のようにするには以下のコードを追加する。

xticks([0 pi 2*pi 3*pi]);
xticklabels({'0', 'T', '2T', '3T'});

まずxticksを用いて指定位置に目盛りを打つ。 その後xticklabelsで目盛りの文字を変更している。

y軸についてもyticks, yticklabelsを使えば同様に変更できる。

文字サイズを一括変更する

下記サイトからの情報。 https://sciotein.com/2019/11/02/matlab%E3%81%A7%E5%9B%B3%E4%B8%AD%E3%81%AE%E6%96%87%E5%AD%97%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E4%B8%80%E5%BA%A6%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

以下のコードを追加する。

fontsize = 11; % ここにフォントサイズを入れる
h = gca;
set(h, 'fontsize', fontsize);

これで大部分の文字はサイズを変更できる。ただし一部の文字については変更できない場合があるので注意。自分の場合、text関数で直接図中に書いた文字は変更されなかった。

変更できない箇所については手動で変更するしかない。例えば、text関数にフォントサイズを与えるには以下のように書く。

text(x, y, '文字', 'fontsize', 11); % x, yは表示位置の座標

図中の2点を双方向矢印↔で結ぶ

矢印の書き方について、3つに分けて説明する。

①annotationを使う

双方向矢印自体は以下のようにすると表示できる。annotation関数に引数'doublearrow'を指定することで、双方向矢印を書くことができる。

annotation('doublearrow', x, y) % x, yはFigureを基準に正規化された座標

しかしこれには問題点がある。公式リファレンスにも記載されているが、x, yには「Figureを基準に正規化された座標」を指定する必要があるのだ。

既定では、単位は Figure を基準に正規化されます。Figure の左下隅が (0,0) にマップされ、右上隅が (1,1) にマップされます。単位を変更するには、Units プロパティを使用します。
例: y = [.3 .5]
(公式リファレンス https://jp.mathworks.com/help/matlab/ref/annotation.html#br2_upx-1-x より引用)

グラフ上の座標を使えないため、なかなか面倒である。

②quiverを使う

矢印を書く方法はもう1つある。quiverを用いれば、普段通りグラフ上の座標を指定できる。

quiver(x, y, u, v, 0);
% x, yは開始位置の座標、u, vはそれぞれ矢印のx, y方向成分

% 5つ目の引数は矢印の長さを自動スケーリングするかを表す。
% ここでは0=スケーリングしないを選択した。

少し記法が難しいが、座標(x, y)からx方向にu, y方向にvだけ伸びた矢印を引くという意味である。
例えばquiver(x, y, 1, 1, 0)とすれば、座標(x, y)からx方向に1、y方向に1だけ伸びた矢印、つまり右上に向かう矢印が引かれる。
この関数を使えば、Figureを基準に正規化された座標を使う必要がないため、容易にグラフ上の2点を結ぶことができる。

しかしこの方法にも問題がある。スタイルとして双方向矢印が選択できないのである。①のannotationとは違い、双方向矢印にするための引数がないのが原因である。

③quiverを2回使用する

quiverを用いてゴリ押しで双方向矢印を書く方法を以下に示す。単方向矢印を2つ重ねて書くことで双方向矢印を再現している。
イメージとしてはこんな感じである。

f:id:kalax:20210427154801p:plain
quiverを使った双方向矢印作成のイメージ図

quiver([2 4], [3 3], [2 -2], [0 0], 0);

以上のコードを実行するとこのように表示される。なお表示範囲は0≦x,y≦5とした。

f:id:kalax:20210427154920p:plain
quiverで描画した双方向矢印

比較的簡単に、いい感じの双方向矢印を書くことができた。

(2021/05/16追記)動画のフレーム間差分を取る

校閲していないので後で書き直すかも)
正攻法でやったらうまくいかなかったが(おそらくuint8絡みのエラー?)、imabsdiff関数を用いたらうまくいった。
行列 = imabsdiff(現在のフレーム, 1つ前のフレーム)の形で記述して、フレーム数の分だけfor文で回してやればよい。

2 つのイメージの差の絶対値 - MATLAB imabsdiff - MathWorks 日本