第6回 MATLAB seminar 2021年07月15日
最終更新:2021/07/16
今回は, エクセルからデータを読み取り, 図にする方法を学んだ. データを読み取る方法を3通り, 図を描く ( いじくる ) 方法を3通り紹介した.
エクセルからデータをよむ
用意したデータは以下のような信号データ. 50kHzで4秒程度計測したものなので20万行程度ある. 俺が学部生の頃はこれをエクセルで読ますとカクカクしたが, 最近は学生のPCでもそんなことがないようだ.
SP VP -0.0018 0.0046 -0.0014 0.0056 0.0012 0.006 0.0023 0.0046 -0.0005 0.0042 -0.004 0.0049 -0.004 0.0042 0.0003 0.006 0.0027 0.006 : : : :
このデータをMATLABに読み取る方法を3つ紹介した.
GUIを使って読み取る方法
直感的な操作で簡単. Current Folder でエクセルシートをクリックするとImport用のウィンドウが開くので, ここでデータ型などを指定してインポートをクリックするだけである.

SP = data13.SP; VP = data13.VP;
この方法は直感的でわかりやすい. 僕も結局はこれを使うことが多いが, データサイズが大きかったり, 連続でたくさんのファイルを読むときは破綻する.
MATLABに読み取るためのコードを作らせてそれを使う方法
MATLABな便利なところに, コードを自動生成してくれる点がある. 今回の場合, 上図のimport selectionの下の▼マークをおして, generate codeを選択すれば, 先程手動で行ったデータの読み取り と同じ作業を行うコードを作ってくれる. 今回の場合以下のようになった.
%% Import data from spreadsheet
% Script for importing data from the following spreadsheet:
%
% Workbook: /Users/koshiba/Desktop/Lectures/matlab_semiar/4/data13.xlsx
% Worksheet: data13
%
% Auto-generated by MATLAB on 16-Jul-2021 17:34:02
%% Set up the Import Options and import the data
opts = spreadsheetImportOptions("NumVariables", 2);
% Specify sheet and range
opts.Sheet = "data13";
opts.DataRange = "A2:B213502";
% Specify column names and types
opts.VariableNames = ["SP", "VP"];
opts.VariableTypes = ["double", "double"];
% Import the data
data13 = readtable("/Users/koshiba/Desktop/Lectures/matlab_semiar/4/data13.xlsx", opts, "UseExcel", false);
%% Clear temporary variables
clear opts
最初から自分でコードを書く方法
実際MATLABに慣れている人は自分でcodeを書いている人が多いのでは無いかと思う. MATLABが自動生成したコードより短く書ける ( ことが多い ) と思う. 詳しくはreadmatrixのページをみてほしい. 今回の場合, 特にオプションを指定しないなら, きわめて簡単にデータをとれる.
>> M = readmatrix('data13.xlsx'); % データよみとり
>> M(1:5, :) % データのチェック
ans =
-0.0018 0.0046
-0.0014 0.0056
0.0012 0.0060
0.0023 0.0046
-0.0005 0.0042
おまけ
様々な複雑な要求があるなら, readmatrixにいろいろオプションを付ける必要がある.
また, これ以外にも多くの関数がある.
僕自身は, 低水準IOを使うことが多い.
複雑だが, 慣れれば柔軟性があってよい.
図を描いてみる
読み取ったデータ使って以下のような図を描く練習をした.

subplot(2, 1, 1)
plot(SP)
xlabel('Data number [-]')
ylabel('Voltage [V]')
title('Original Data')
subplot(2, 1, 2)
fs = 50000; % sampling rate 50kHz
plot((0:length(SP)-1)/fs, SP)
xlabel('Time [sec]')
ylabel('Voltage [V]')
title('Beatiful Data')
yyaxis right
plot((0:length(VP)-1)/fs, VP)
ylabel('Voltage [V]')
legend('Blue', 'Orange', 'Box', 'off')
余談だけど, MATLABの凡例の線って長いと思う. 凡例の線を短くする関数を作ったので, もしよければ見てみてください.
図をいじってみる
図を弄る方法を3つ紹介した.
GUIでいじくる
これまたGUIなのでわかりやすい. 僕も, 最後に凡例の位置を動かしたりするのに使うことがある.

函数でつける
上に紹介したコードの中にある, xlabel, ylabel, legendといった函数.
図を描いてから, こういった函数で上からペタペタラベルを追加するような感覚で図をいじくれる.
調べるといろいろな函数が用意されているよう.
僕がよく使うのは,
- xlabel, ylabel
- xlim, ylim
- xticks, yticks
- legend, title
- colorbar, colormap
Figure ハンドルをいじる方法
fig = gcf
figの中に格納される.
ぶっちゃけ, 僕はハンドルが何か今ひとつわかっていない.
しかし, この”ハンドル”の中には描かれた図の全てが詰まっている.
どれくらい全てかというと, 図示した生データの値や, いま図がPC画面上のどこらへんにあるかまでつまっている.
figの中身をみてみると, いろいろな情報が入っているが, とくに, Childrenにアクセスすると, 軸や凡例の情報が入っている.
>> fig
fig =
Figure (1) with properties:
Number: 1
Name: ''
Color: [0.9400 0.9400 0.9400]
Position: [1000 918 560 420]
Units: 'pixels'
Show all properties
>> fig.Children
ans =
3×1 graphics array:
Legend (Blue, Orange)
Axes (Beatiful Data)
Axes (Original Data)

まず, 以下の図を対象とすることにする.
% 図を描く
plot(SP)
xlabel('Data number [-]')
ylabel('Voltage [V]')
legend('singal')
% ハンドルを取得
fig = gcf;
% 子を確認
fig.Children
ans = % axis(plotのエリア)と凡例のエリアがいる.
2×1 graphics array:
Legend (singal)
Axes
% いじりやすいようにaxis, legendそれぞれを変数に格納
leg = fig.Children(1);
ax = fig.Children(2)

-
図のフォントサイズとフォントをかえる. 軸の外の情報は
axに入っているので, その中でFontに関わりそうなのを探せば良い.MATLAB図が結構押されてしまったがなんとか, 目的は果たされた.>>ax.FontName % フォントを確認 ans = 'Times New Roman' >> ax.FontSize % フォントサイズを確認 ans = 6 % それぞれ以下のように変えてやる >> ax.FontSize = 10; >> ax.FontName = 'Arial';

- X軸のラベルと色をかえたい.
MATLAB
>> ax.XTickLabel % 現在のX軸のラベル ( XTickLabel ) を確認 ans = 3×1 cell array {'0'} {'1'} {'2'} >> ax.XColor % 現在のX軸の色を確認 ans = 0 0 0 % 黒 % それぞれ以下のように変えてやる >> ax.XTickLabel = {'A', 'B', 'C'}; >> ax.XColor = [1 0 0]; % 赤色, 'r'でもOK
- 凡例の枠の太さを太くしたい.
MATLAB
>> leg.LineWidth % 現在の太さをチェック ( 今度はax ではなく l であることに注意 ) ans = 0.5000 % 以下のように変えてやる >> leg.LineWidth = 2;

おそらく, なんでもできる.
データ
セミナーで使ったデータはここをクリック.