guiメモ

技術寄りの雑記(予定)

MATLABでいい感じにグラフを作る

概要

MATLABでいい感じにグラフを作る方法をいつも忘れてしまうのでメモしておきます。 CSVデータをMATLABに取り込んで、いい感じにグラフ化したものをトリミング済みのPDFで保存するまでの工程についてご説明します。

方法

データの準備

MATLABとグラフ化したいCSVデータを用意します。変なことをしない限り追加のToolbox等は不要であると思います。

なおデータについてはCSV形式でなくてもOKで、例えばSimulinkで何かのシミュレーションをしてワークスペースに持ってきたデータなども使えます。

データの取り込み

新規ライブスクリプトを作成し、CSVデータをreadmatrix関数で読み取ります。この際、'TrimNonNumeric'オプションをtrueにすると変な文字等が無視され、数値だけが読み込まれるようになります。私事ですが、この機能がなければ研究がかなりマズいことになってました。

例としてhoge.csvを取り込んで変数dataに格納する場合、コードは次のようになります。

data = readmatrix('hoge.csv', 'TrimNonNumeric', true);

取り込んだデータの処理

ここでは例としてCSVデータの1列目に時間、2列目に正弦波の振幅データが保存されているとします。 1列目のデータをx軸、2列目のデータをy軸にプロットし、軸ラベルとグリッドを表示するには

data = readmatrix('hoge.csv', 'TrimNonNumeric', true);

plot(data(:,1), data(:,2))
xlabel('Time[s]')
ylabel('Amplitude')
grid on

とします。ここまでのコードを実行すると、次のようなグラフが表示されます。

f:id:gui_robo:20220202223248p:plain
実行結果
データを可視化するだけであればここまでの工程で十分ですが、レポートや論文等に載せるとなると内容的に不足があります。 最低限、凡例を追加してフォントをTimes New Romanに揃えるなどしておきたいです。

グラフをいい感じにする

とりあえず凡例を先に追加しましょう。凡例はlegend関数で追加することができます。凡例内でTeX記法を使いたい場合は'Interpreter''latex'とし、フォントをTimes New Romanにしたい場合は'FontName''Times New Roman'とします。これは軸ラベルでも同様なので、コードを次のように書き換えます。

data = readmatrix('hoge.csv', 'TrimNonNumeric', true);

plot(data(:,1), data(:,2))
xlabel('Time $t$ [s]', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
ylabel('Amplitude', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
legend({'$\sin{t}$'}, 'Interpreter', 'latex', 'FontName', 'Times New Roman')
grid on

すると、次のようなグラフが表示されます。

f:id:gui_robo:20220202224427p:plain
実行結果
データがない部分も表示されてて少々気持ちが悪いので、xlim関数で表示する領域を制限します。ここでは0~2\piの範囲を指定します。

data = readmatrix('hoge.csv', 'TrimNonNumeric', true);

plot(data(:,1), data(:,2))
xlim([0 2*pi])
xlabel('Time $t$ [s]', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
ylabel('Amplitude', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
legend({'$\sin{t}$'}, 'Interpreter', 'latex', 'FontName', 'Times New Roman')
grid on

f:id:gui_robo:20220202225206p:plain
実行結果
これで大分マシなグラフになりました。ちなみにライブエディタ上で凡例をドラッグすると、その位置で凡例を表示するようなコードを生成してくれます。

いい感じにPDFで出力する

いい感じにグラフができたので、次はいい感じにPDFで出力します。グラフが表示されているウィンドウから直接出力しても良いのですが、余白なども一緒に出力されてしまい少々不便なのでexportgraphics関数を使います。ここではfigure.pdfとして出力します。

data = readmatrix('hoge.csv', 'TrimNonNumeric', true);

plot(data(:,1), data(:,2))
xlim([0 2*pi])
xlabel('Time $t$ [s]', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
ylabel('Amplitude', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
legend({'$\sin{t}$'}, 'Interpreter', 'latex', 'FontName', 'Times New Roman')
grid on
exportgraphics(gcf, 'figure.pdf', 'Resolution', 300)

すると、このようなトリミング済みのPDFファイルが出力されます。(以下はPDFファイルをPNGに変換したものです)

f:id:gui_robo:20220202231511p:plain
実行結果
基本的にはこのままで良いのですが、何らかの弾みで目盛のフォントがTimes New Romanではない何かになってしまう場合があるので対策を施す必要があります。ついでにグラフの大きさも比率で指定できるように修正します。フォントの問題はPDFで出力する直前にgca.FontName = 'Times New Roman';とすることで対策ができます。比率はget関数でグラフの位置を取得し、set関数でグラフの位置を改めて指定してあげることで調整することができます。横の長さを0.75倍、縦の長さを0.5倍にする例を以下に示します。

data = readmatrix('hoge.csv', 'TrimNonNumeric', true);

plot(data(:,1), data(:,2))
xlim([0 2*pi])
xlabel('Time $t$ [s]', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
ylabel('Amplitude', 'Interpreter', 'latex', 'FontName', 'Times New Roman')
legend({'$\sin{t}$'}, 'Interpreter', 'latex', 'FontName', 'Times New Roman')
grid on
position = get(gcf, 'Position');
set(gcf, 'Position', [position(1) position(2) position(3)*0.75 position(4)*0.5])
gca.FontName = 'Times New Roman';
exportgraphics(gcf, 'figure.pdf', 'Resolution', 300)

すると、次のように出力されます。(以下はPDFファイルをPNGに変換したものです)

f:id:gui_robo:20220202231410p:plain
実行結果
このように、いい感じの大きさでいい感じにトリミングされたグラフのPDFファイルが得られました。

まとめ

本稿ではMATLABを用いていい感じにグラフを作成し、いい感じにトリミングがされたPDFファイルで出力する方法について説明しました。一度このライブスクリプトを作っておくとCSVファイルからグラフを作りたくなった時に非常に便利ですので、是非作成することをお勧めします。特にオシロスコープから出力される10000行を超えるようなCSVデータをExcelで逐一処理するのは時間的にも精神的にもキツいものがあります。(Excelでもいい感じにできる方法をご存知の方がいらっしゃれば是非教えてください)