MATLABで箱ひげ図をプロットしたい場合、boxchart関数を使用することで簡単に箱ひげ図をプロットすることができる。
ボックス チャート (箱ひげ図) – MATLAB boxchart – MathWorks 日本
boxchart関数の使い方
boxchart関数は主に2つの使い方があり、1つは行列をそのまま箱ひげ図としてプロットしたい場合。もう1つはラベルに箱ひげ図を対応させてプロットする場合。多くの場合は後者のケースだし、自分も後者のケースが公式サイトを読んでもいまいち(特にcategorical行列について)わからなかったので今回調べてみた。
行列をそのまま箱ひげ図としてプロットする場合
行列を単純に箱ひげ図としてプロットする場合、boxchart関数の第一引数に行列を指定するだけで簡単に箱ひげ図を作成する事ができる。
A = rand(10); % ランダムな行列を生成
boxchart(A);
行列を箱ひげ図として扱う場合、1つの列が1つの箱に対応していることに注意する必要がある。行と列が逆の場合、ぜんぜん違う箱ひげ図が出てくるので、もしワークスペースにある行列の行ごとに箱を作成したい場合、行列を転置させる必要がある。
カテゴリに分類して箱ひげ図を作成する場合(箱にラベルを付けたい場合)
ここから本題で、1つの箱に対して何かしらラベルを付けたりカテゴリに分けたい。こちらは少し手間で、最初にカテゴリを作成する必要がある。categorical関数を使い慣れていない方は公式ページの使用例を見てもよくわからないと思う(私もそうだった)ので、ここでは簡単な例を使って説明する。まず、以下のように配列 a, b, c があり、これらを箱ひげ図としてプロットする場合を考える。
a = 1:10;
b = rand(10,1);
c = rand(10,1);
boxchart([a b c])
x軸のラベルは特に何も指定していないため、1から順番に番号が振られているだけとなる。ここで、aの箱には「a」、bの箱には「b」、cの箱には「c」とラベルを振る場合を考える。最初に注意として、ラベルを振る場合は表示するデータを一次元の行ベクトルまたは列ベクトルにする必要がある(行列は不可)。ラベルの配列の形も同様でデータとラベルを1対1で対応させる。
ここでcategorical関数を使ってカテゴリ配列を作成する必要がある。categorical関数は簡単に説明するのが難しく、公式サイトと同じように「カテゴリ(配列)を作成する」関数ととりあえずいっておく。カテゴリというのは一般的なカテゴリ(カテゴリー)と同じと考えてもらえばよく、今回の例だと”a”, “b”, “c”というカテゴリがある。categorical関数の第一引数に何かしらの配列を与えるとカテゴリ配列という配列が返ってくる。
labels = ["a"; "b"; "c"; "a"; "a"; "c"];
label_cates = categorical(labels)
% 6×1 の categorical 配列
%
% a
% b
% c
% a
% a
% c
カテゴリなのに重複していていいの?と思うかもしれないが、「カテゴリ配列」とは各要素が何かしらのカテゴリ(今回だとa,b,cというカテゴリ)のいずれかに属しているという情報を持っている配列となるので要素のカテゴリが重複していてもいい(1つのカテゴリに複数の要素があるのは一般的に想定される状況。むしろ1つのカテゴリに1つの要素しかないなら分ける必要がない)。カテゴリの確認は「categories関数」を使うことでカテゴリ配列のカテゴリ一覧をセル配列として取得することができる。
labels = ["a"; "b"; "c"; "a"; "a"; "c"];
label_cates = categorical(labels);
categories(label_cates)
% 3×1 の cell 配列
%
% {'a'}
% {'b'}
% {'c'}
ここまででラベル付きの箱ひげ図の作成準備ができた。それでは、a, b, cというデータ配列に”a”, “b”, “c”というラベルがついている箱ひげ図を作成する。
% 適当は整数配列を作成
a = 1:10;
b = 5:14;
c = 3:12;
data = [a b c];
% それぞれのデータのラベルを作成
% repmatは指定したサイズの行列をすべて同じ要素で埋めてくれる関数
a_label = repmat("a", [1 10]); % 要素がすべて"a"である 1x10 の列ベクトル
b_label = repmat("b", [1 10]);
c_label = repmat("c", [1 10]);
% カテゴリ配列を作成
label_cates = categorical([a_label b_label c_label]);
% 箱ひげ図を作成
boxchart(label_cates, data);
ラベルがついた。いちいちラベルのカテゴリ配列を作成するのは面倒だが、なれてしまうとrepmat関数などを使用して簡単にラベル付きの箱ひげ図を作成することができる。本記事ではカテゴリ配列の一部の機能しか使用していないが、値と異なるカテゴリ名に紐づけたりもできる。categorical関数の解説記事を書く機会があればそちらも触れてみたい。
コメント