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を使えば同様に変更できる。
文字サイズを一括変更する
以下のコードを追加する。
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つ重ねて書くことで双方向矢印を再現している。
イメージとしてはこんな感じである。
quiver([2 4], [3 3], [2 -2], [0 0], 0);
以上のコードを実行するとこのように表示される。なお表示範囲は0≦x,y≦5とした。
比較的簡単に、いい感じの双方向矢印を書くことができた。
(2021/05/16追記)動画のフレーム間差分を取る
(校閲していないので後で書き直すかも)
正攻法でやったらうまくいかなかったが(おそらくuint8絡みのエラー?)、imabsdiff関数を用いたらうまくいった。
行列 = imabsdiff(現在のフレーム, 1つ前のフレーム)
の形で記述して、フレーム数の分だけfor文で回してやればよい。