第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用のウィンドウが開くので, ここでデータ型などを指定してインポートをクリックするだけである.
このように, table型として読み込むと, ヘッダも取り込むことができるのでデータ解析などには便利である. 今回は, 実数の配列ついて取り込みたかったので以下のように, 配列だけぬきだした.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;
おそらく, なんでもできる.
データ
セミナーで使ったデータはここをクリック.