geoscatter でcolormap をturbo に変更

1年に2回のアップデートがあるMATLAB の最新バージョンR2021b が日本時間の9月23日にリリースされました。

毎回、どんな新しいツールや新機能、機能強化があるのかなとリリースノートを眺めるのが楽しみなのですが、今日R2021b のリリースノートを眺めていると、Mapping Toolbox に魅力的な新機能が。

【MathWorks】Mapping ToolboxのR2021bリリースノート
【MathWorks】Mapping Toolbox のR2021b リリースノート

readgeotable という関数が登場して、位置情報を含むテーブルを直接読み込めるようになり、GPX ファイルにも対応しているのです。

【MathWorks】MATLAB のreadgeotableのドキュメント

こちらの記事で紹介しましたが、GPX ファイルはApple Watch でエクササイズするときに使うApple のアプリ「ワークアウト」のデータを「ヘルスケア」アプリからエクスポートすると登場するファイルフォーマットです。

ウォーキング、ランニング、サイクリングなどをしたときのワークアウトデータが1つ1つGPX ファイルとして保存されています。

Mapping Toolbox にはR2012a から使える gpxファイル読み取りのための関数gpxread があります。

【MathWorks】MATLAB のgpxreadのドキュメント

ただ、ワークアウトのGPX ファイルに使ってみると、位置情報(Lat、Lon、Elev)は読み込まれますが、ランニングやウォーキングに記録される速度の情報が含まれていません。GPX ファイルには含まれているので、gpxread で読み込むときにデータが無視されてしまっているようです。

p = gpxread(fullfile('workout-routes', 'route_2021-08-16_6.09pm.gpx'));
disp(p)Code language: Matlab (matlab)

実行結果

MATLAB のgpxread 関数で読み込んだワークアウトデータ
MATLAB のgpxread 関数で読み込んだワークアウトデータ

いくら.gpx のファイル拡張子になっていても、gpxread ではワークアウトのGPX ファイルを完全に読み込めません。

そこでgpx ファイルをテキストエディターで開いて閃いたのですが、拡張子こそ違えど、XML 形式のファイルなので、R2020b にMATLAB 本体に導入されたreadstruct が使えると思いつきました。

【MathWorks】MATLAB のreadstruct のドキュメント

サンプルは下記のとおりです。

% GPX ファイルをXML として読み込み
xmlObj = readstruct(fullfile('workout-routes', 'route_2021-08-16_6.16pm.gpx'), 'FileType', 'xml');

% 構造体からテーブルに変換
tbl = struct2table(xmlObj.trk.trkseg.trkpt);

% extensions カラムを展開
tbl2 = struct2table(tbl.extensions);
for n=1:length(tbl2.Properties.VariableNames)
    varname = tbl2.Properties.VariableNames{n};
    tbl.(varname) = tbl2.(varname);
end

% 展開し終えたextensions カラムを空にする
tbl.extensions = [];

% 地図にランニングの速度のヒートマップをプロット
geoscatter(tbl.latAttribute, tbl.lonAttribute, 36, ...
    [tbl.speed/max(tbl.speed) zeros(length(tbl.speed), 1), 1-tbl.speed/max(tbl.speed)], 'filled')Code language: Matlab (matlab)

実行結果

MATLAB のgeoscatter 関数でApple Watch のワークアウトのランニング速度を地図に可視化
MATLAB のgeoscatter 関数でApple Watch のワークアウトのランニング速度を地図に可視化

この方法でしばらく解析していたのですが、構造体で読み込んだ後にテーブルに変換して、入れ子になってしまうextensions というカラムをfor 文で展開するのが面倒だなぁとは思っていました。

それが、R2021b に登場したreadgeotable 関数を使うと劇的に楽になります。

早速ワークアウトのGPX ファイルに使ってみましょう。テーブルなのでhead 関数で先頭8行のプレビューもできます。

tbl = readgeotable(fullfile('workout-routes', 'route_2021-08-16_6.16pm.gpx'));
head(tbl)Code language: Matlab (matlab)

実行結果

MATLAB のreadgeotable 関数で読み込んだワークアウトデータ
MATLAB のreadgeotable 関数で読み込んだワークアウトデータ

緯度経度がShape というカラムにgeopointshape という形式で保存されています。ちゃんとランニングの速度データもSpeed カラムに入りましたね。GPX ファイルのデータを完全にテーブルとして取り込めています。

地図への速度データのヒートマッププロットは先ほどと同じgeoscatter でできます。

tbl というテーブルに入れていますが、カラムの名前が変わっているのでそこだけが違いですね。

geoscatter(tbl.Shape.Latitude, tbl.Shape.Longitude, 36, ...
    [tbl.Speed/max(tbl.Speed) zeros(length(tbl.Speed), 1), 1-tbl.Speed/max(tbl.Speed)], 'filled')Code language: Matlab (matlab)
MATLAB のgeoscatter 関数でApple Watch のワークアウトのランニング速度を地図に可視化
MATLAB のgeoscatter 関数でApple Watch のワークアウトのランニング速度を地図に可視化

本来はhead 関数でのプレビューは無くて良いので、ワークアウトのGPX ファイルをreadgeotable で読み込んで、geoscatter で可視化するまでたったの2行でできます。実行時間もtic とtoc で計測したら手元のノートパソコンでは0.2秒以内で済みました。実行時間も速いですね。

MATLAB のR2021b のMapping Toolbox の新機能readgeotable を使って、Apple Watchのヘルスデータ解析がますます楽しくなってきました。

上記では速度の速いものが赤、遅いものが青でプロットしていますが、予め定義されたカラーマップを使って楽しちゃいましょう。さらにカラーバーを付けてみます。

<meta charset="utf-8">tbl = readgeotable(fullfile('workout-routes', 'route_2021-08-16_6.16pm.gpx'));
geoscatter(tbl.Shape.Latitude, tbl.Shape.Longitude, [], tbl.Speed, 'filled')
c = colorbar;
c.Label.String = 'Speed [m/s]'; % カラーバーのラベルを設定
c.Limits = [0 5]; % カラーバーの上下限を設定Code language: Matlab (matlab)

実行結果

geoscatter でcolorbar 付きでプロット
geoscatter でcolorbar 付きでプロット

これでどこで走る速度が上がったり下がったりしているのか見やすくなりましたね。

ただ、一番速いのが黄色っていうのは直感と合わないので、カラーマップをデフォルトのparula から変えてみましょう。

青→黄緑→黄→オレンジ→赤と滑らかに変わっていくturbo にしてみます。

先ほどのコードの最後に以下を追加します。

colormap turboCode language: Matlab (matlab)

実行結果

geoscatter でcolormap をturbo に変更
geoscatter でcolormap をturbo に変更

これなら速いところが赤くて直感に近くなった気がします。

視覚的な印象を変えるカラーバーとカラーマップ、意外に重要ですね。

Categories:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です