第6回 MATLAB seminar 2021年07月15日

今回は, エクセルからデータを読み取り, 図にする方法を学んだ. データを読み取る方法を3通り, 図を描く ( いじくる ) 方法を3通り紹介した.

エクセルからデータをよむ


用意したデータは以下のような信号データ. 50kHzで4秒程度計測したものなので20万行程度ある. 俺が学部生の頃はこれをエクセルで読ますとカクカクしたが, 最近は学生のPCでもそんなことがないようだ.

EXCELL
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用のウィンドウが開くので, ここでデータ型などを指定してインポートをクリックするだけである.

name
このように, table型として読み込むと, ヘッダも取り込むことができるのでデータ解析などには便利である. 今回は, 実数の配列ついて取り込みたかったので以下のように, 配列だけぬきだした.
MATLAB
SP = data13.SP;
VP = data13.VP;
感覚的には, table型の場合それぞれのデータはヘッダの名前の部屋にしまわれている ( 今回の場合, SPやVP ) . カンマを使うことで, それぞれの部屋にアクセスできる.

この方法は直感的でわかりやすい. 僕も結局はこれを使うことが多いが, データサイズが大きかったり, 連続でたくさんのファイルを読むときは破綻する.

MATLABに読み取るためのコードを作らせてそれを使う方法

MATLABな便利なところに, コードを自動生成してくれる点がある. 今回の場合, 上図のimport selectionの下の▼マークをおして, generate codeを選択すれば, 先程手動で行ったデータの読み取り と同じ作業を行うコードを作ってくれる. 今回の場合以下のようになった.

MATLAB
%% 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のページをみてほしい. 今回の場合, 特にオプションを指定しないなら, きわめて簡単にデータをとれる.

MATLAB
	
 >> 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を使うことが多い. 複雑だが, 慣れれば柔軟性があってよい.

図を描いてみる


読み取ったデータ使って以下のような図を描く練習をした.

name
コード
MATLAB
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なのでわかりやすい. 僕も, 最後に凡例の位置を動かしたりするのに使うことがある.

name

函数でつける

上に紹介したコードの中にある, xlabel, ylabel, legendといった函数. 図を描いてから, こういった函数で上からペタペタラベルを追加するような感覚で図をいじくれる. 調べるといろいろな函数が用意されているよう. 僕がよく使うのは,

程度かな.

Figure ハンドルをいじる方法

MATLAB
fig = gcf
とすることで, 現在選択している図のハンドルが取得できて, figの中に格納される. ぶっちゃけ, 僕はハンドルが何か今ひとつわかっていない. しかし, この”ハンドル”の中には描かれた図の全てが詰まっている. どれくらい全てかというと, 図示した生データの値や, いま図がPC画面上のどこらへんにあるかまでつまっている.

figの中身をみてみると, いろいろな情報が入っているが, とくに, Childrenにアクセスすると, 軸や凡例の情報が入っている.

MATLAB
>> 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)
このように, 図の情報を入れ子になっており, イメージとしては以下の包含関係である ( 上で描いた図の場合 ) .
name
つまり, figの子は凡例, 軸1, 軸2であり, さらに軸1はplotを子としてもっているのである. なので, それぞれの対象の情報を直接書き換えることで図のプロパティを変更できる. これが, 便利は僕はもっぱらこの方法で図をアレンジしている. 到底全て説明しきれないので, 以下にいくつか例を示す.

まず, 以下の図を対象とすることにする.

MATLAB
% 図を描く
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)
name

  1. 図のフォントサイズとフォントをかえる. 軸の外の情報はaxに入っているので, その中でFontに関わりそうなのを探せば良い.

    MATLAB
    >>ax.FontName % フォントを確認
    ans = 'Times New Roman'
    
    >> ax.FontSize % フォントサイズを確認
    ans = 6
    
    % それぞれ以下のように変えてやる
    >> ax.FontSize = 10;
    >> ax.FontName = 'Arial';
    図が結構押されてしまったがなんとか, 目的は果たされた.
    name

  2. 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
    name
  3. 凡例の枠の太さを太くしたい.
    MATLAB
    >> leg.LineWidth % 現在の太さをチェック ( 今度はax ではなく l であることに注意 ) 
    ans = 0.5000
    
    % 以下のように変えてやる
    >> leg.LineWidth = 2;
    name

おそらく, なんでもできる.

データ

セミナーで使ったデータはここをクリック.

この記事のTOP    BACK    TOP