【入門】MATLABで始めるデータ可視化 - 基本プロットから応用まで
はじめに
MATLABは科学技術計算に特化したプログラミング言語で、特にデータの可視化において強力な機能を提供しています。本記事では、MATLABを使った基本的な2Dプロットから3Dプロット、さらにアニメーションの作成まで、実践的なコード例を交えながら解説します。
本記事で学べること
- 基本的な2Dプロット(plot, scatter, bar, histogram)の使い方
- 3D空間でのデータ可視化(surf, mesh, plot3)
- 動的なデータ表現のためのアニメーション作成
- プロフェッショナルな見た目のグラフを作るためのカスタマイズ方法
動作環境
- MATLAB R2020a以降(それ以前のバージョンでも基本的な機能は動作します)
2Dプロット - 基本的なデータ可視化
1. plot関数 - 線グラフの描画
最も基本的なプロット関数です。連続的なデータの変化を表現するのに適しています。
% サンプルデータの生成
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
% 基本的なプロット
figure;
plot(x, y1);
title('正弦波');
xlabel('x');
ylabel('y');
grid on;
% 複数のデータを同時にプロット
figure;
plot(x, y1, 'b-', x, y2, 'r--');
title('正弦波と余弦波');
xlabel('x');
ylabel('y');
legend('sin(x)', 'cos(x)');
grid on;
2. scatter関数 - 散布図の作成
データ点の分布や相関関係を視覚化するのに便利です。
% ランダムデータの生成
n = 100;
x = randn(n, 1);
y = 2*x + 0.5*randn(n, 1);
colors = rand(n, 1); % 色情報
% 基本的な散布図
figure;
scatter(x, y);
title('基本的な散布図');
xlabel('X値');
ylabel('Y値');
% カラーマップを使った散布図
figure;
scatter(x, y, 50, colors, 'filled');
colorbar;
title('カラーマップ付き散布図');
xlabel('X値');
ylabel('Y値');
3. bar関数 - 棒グラフの作成
カテゴリカルなデータの比較に最適です。
% カテゴリデータの準備
categories = {'製品A', '製品B', '製品C', '製品D', '製品E'};
sales2023 = [120, 150, 90, 200, 175];
sales2024 = [140, 160, 110, 190, 210];
% 単一の棒グラフ
figure;
bar(sales2023);
set(gca, 'XTickLabel', categories);
title('2023年売上高');
ylabel('売上高(百万円)');
% グループ化された棒グラフ
figure;
bar([sales2023; sales2024]');
set(gca, 'XTickLabel', categories);
title('売上高の年次比較');
ylabel('売上高(百万円)');
legend('2023年', '2024年');
4. histogram関数 - ヒストグラムの作成
データの分布を理解するための基本的なツールです。
% 正規分布データの生成
data1 = randn(1000, 1);
data2 = 2 + 0.5*randn(1000, 1);
% 基本的なヒストグラム
figure;
histogram(data1, 30);
title('正規分布のヒストグラム');
xlabel('値');
ylabel('頻度');
% 複数のヒストグラムの重ね合わせ
figure;
histogram(data1, 30, 'FaceAlpha', 0.5);
hold on;
histogram(data2, 30, 'FaceAlpha', 0.5);
title('2つの分布の比較');
xlabel('値');
ylabel('頻度');
legend('分布1', '分布2');
3Dプロット - 立体的なデータ可視化
1. surf関数 - 3D曲面の描画
連続的な3次元データを滑らかな曲面として表現します。
% メッシュグリッドの生成
[X, Y] = meshgrid(-3:0.1:3, -3:0.1:3);
Z = sin(sqrt(X.^2 + Y.^2)) ./ sqrt(X.^2 + Y.^2);
% 基本的な曲面プロット
figure;
surf(X, Y, Z);
title('3D曲面プロット');
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
colorbar;
% カラーマップの変更
figure;
surf(X, Y, Z);
colormap('jet');
shading interp; % 滑らかなシェーディング
title('滑らかな3D曲面');
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
2. mesh関数 - ワイヤーフレーム表示
データの構造を理解しやすいワイヤーフレーム形式で表示します。
% ガウス関数の例
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = exp(-(X.^2 + Y.^2));
% メッシュプロット
figure;
mesh(X, Y, Z);
title('ガウス関数のメッシュプロット');
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
% メッシュとコンター線の組み合わせ
figure;
meshc(X, Y, Z);
title('メッシュとコンター線');
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
3. plot3関数 - 3D線プロット
3次元空間での軌跡や曲線を描画します。
% パラメトリック曲線(螺旋)
t = 0:0.1:10*pi;
x = sin(t);
y = cos(t);
z = t;
% 基本的な3D線プロット
figure;
plot3(x, y, z, 'b-', 'LineWidth', 2);
title('3D螺旋');
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
grid on;
% 複数の3D曲線
figure;
plot3(x, y, z, 'b-', 'LineWidth', 2);
hold on;
plot3(x*0.5, y*0.5, z, 'r-', 'LineWidth', 2);
title('複数の3D螺旋');
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
legend('螺旋1', '螺旋2');
grid on;
アニメーションの作成方法
1. 基本的なアニメーション
リアルタイムでデータの変化を表示する方法です。
% 波の伝播アニメーション
figure;
x = linspace(0, 4*pi, 100);
for t = 0:0.1:4*pi
y = sin(x - t);
plot(x, y, 'b-', 'LineWidth', 2);
axis([0 4*pi -1.5 1.5]);
title(sprintf('波の伝播 (t = %.1f)', t));
xlabel('位置');
ylabel('振幅');
grid on;
drawnow;
pause(0.05);
end
2. 3Dアニメーション
3次元空間でのアニメーション例です。
% 回転する3D曲面
figure;
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X.*exp(-X.^2 - Y.^2);
h = surf(X, Y, Z);
shading interp;
colormap('parula');
axis([-2 2 -2 2 -0.5 0.5]);
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
% 視点を回転
for angle = 0:2:360
view(angle, 30);
drawnow;
pause(0.05);
end
3. アニメーションの保存
作成したアニメーションをGIFやビデオファイルとして保存する方法です。
% GIFアニメーションの作成
filename = 'wave_animation.gif';
x = linspace(0, 4*pi, 100);
figure;
for n = 1:40
t = n * 0.1;
y = sin(x - t);
plot(x, y, 'b-', 'LineWidth', 2);
axis([0 4*pi -1.5 1.5]);
title('波のアニメーション');
xlabel('位置');
ylabel('振幅');
grid on;
% GIFに追加
frame = getframe(gcf);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
if n == 1
imwrite(imind, cm, filename, 'gif', 'Loopcount', inf, 'DelayTime', 0.1);
else
imwrite(imind, cm, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
end
end
見やすいグラフを作るためのTips
1. 色の効果的な使い方
視認性の高い配色とアクセシビリティを考慮した色選択が重要です。
% カラーブラインドフレンドリーな配色
colors = [
0.0000 0.4470 0.7410; % 青
0.8500 0.3250 0.0980; % オレンジ
0.9290 0.6940 0.1250; % 黄
0.4940 0.1840 0.5560; % 紫
0.4660 0.6740 0.1880; % 緑
0.3010 0.7450 0.9330; % 水色
0.6350 0.0780 0.1840 % 赤
];
% 複数データの識別しやすいプロット
figure;
x = 0:0.1:10;
hold on;
for i = 1:5
y = sin(x + i*pi/5);
plot(x, y, 'Color', colors(i,:), 'LineWidth', 2);
end
title('識別しやすい配色の例');
xlabel('x');
ylabel('y');
legend('データ1', 'データ2', 'データ3', 'データ4', 'データ5');
grid on;
2. ラベルとタイトルの最適化
情報を明確に伝えるためのテキスト要素の工夫です。
% プロフェッショナルなグラフの例
figure;
x = 1:12;
y1 = 100 + 20*sin(x/2) + 5*randn(size(x));
y2 = 80 + 15*cos(x/2) + 5*randn(size(x));
plot(x, y1, 'o-', 'LineWidth', 2, 'MarkerSize', 8, 'MarkerFaceColor', 'auto');
hold on;
plot(x, y2, 's-', 'LineWidth', 2, 'MarkerSize', 8, 'MarkerFaceColor', 'auto');
% フォントサイズとスタイルの調整
title('2024年月別売上推移', 'FontSize', 16, 'FontWeight', 'bold');
xlabel('月', 'FontSize', 14);
ylabel('売上高(百万円)', 'FontSize', 14);
% X軸のラベルをカスタマイズ
months = {'1月', '2月', '3月', '4月', '5月', '6月', ...
'7月', '8月', '9月', '10月', '11月', '12月'};
set(gca, 'XTick', 1:12, 'XTickLabel', months);
set(gca, 'FontSize', 12);
% グリッドとボックスの調整
grid on;
box on;
set(gca, 'GridLineStyle', '--', 'GridAlpha', 0.3);
3. 凡例の効果的な配置
凡例はデータを邪魔しない位置に配置し、必要な情報を簡潔に表示します。
% 凡例の配置例
figure;
subplot(2,2,1);
x = 0:0.1:10;
plot(x, sin(x), x, cos(x));
legend('sin(x)', 'cos(x)', 'Location', 'best');
title('自動配置');
subplot(2,2,2);
plot(x, sin(x), x, cos(x));
legend('sin(x)', 'cos(x)', 'Location', 'northwest');
title('左上配置');
subplot(2,2,3);
plot(x, sin(x), x, cos(x));
legend('sin(x)', 'cos(x)', 'Location', 'southeast');
title('右下配置');
subplot(2,2,4);
plot(x, sin(x), x, cos(x));
h = legend('sin(x)', 'cos(x)');
set(h, 'Position', [0.7 0.2 0.15 0.1]);
title('カスタム位置');
4. 総合的な例 - プロフェッショナルなグラフ
これまでの要素を組み合わせた実践的な例です。
% データの準備
months = 1:12;
product_A = [45 52 48 58 65 72 78 82 75 68 55 50];
product_B = [38 41 45 48 52 58 65 68 62 55 48 42];
product_C = [28 30 32 35 38 42 48 45 40 35 32 30];
% Figure の設定
figure('Position', [100 100 800 500]);
% 棒グラフの作成
b = bar(months, [product_A; product_B; product_C]', 'grouped');
% 色の設定
b(1).FaceColor = [0.2 0.4 0.6];
b(2).FaceColor = [0.8 0.2 0.2];
b(3).FaceColor = [0.2 0.6 0.2];
% タイトルとラベル
title('2024年 製品別月間売上高', 'FontSize', 18, 'FontWeight', 'bold');
xlabel('月', 'FontSize', 14);
ylabel('売上高(百万円)', 'FontSize', 14);
% X軸のカスタマイズ
month_labels = {'1月', '2月', '3月', '4月', '5月', '6月', ...
'7月', '8月', '9月', '10月', '11月', '12月'};
set(gca, 'XTickLabel', month_labels, 'FontSize', 11);
xtickangle(45);
% 凡例
legend({'製品A', '製品B', '製品C'}, 'Location', 'northwest', ...
'FontSize', 12, 'Box', 'off');
% グリッドとスタイル
grid on;
set(gca, 'GridLineStyle', ':', 'GridAlpha', 0.5);
set(gca, 'Box', 'off');
% Y軸の範囲調整
ylim([0 90]);
まとめ
本記事では、MATLABを使ったデータ可視化の基本から応用まで幅広く解説しました。
重要なポイント
-
適切なプロット関数の選択
- 連続データ:
plot
- 点データ:
scatter
- カテゴリデータ:
bar
- 分布データ:
histogram
- 連続データ:
-
3D可視化の使い分け
- 滑らかな曲面:
surf
- 構造の理解:
mesh
- 3D軌跡:
plot3
- 滑らかな曲面:
-
効果的な可視化のコツ
- 適切な色選択でデータを識別しやすく
- 明確なラベルとタイトルで情報を正確に伝達
- 凡例の適切な配置でグラフの見やすさを向上
次のステップ
- より高度なカスタマイズ(
axes
プロパティの詳細設定) - インタラクティブなプロット(
uicontrol
、callback
関数) - 専門分野向けのツールボックス活用(Signal Processing、Image Processing等)
MATLABの可視化機能を使いこなすことで、データの持つ意味をより効果的に伝えることができます。ぜひ実際のデータで試してみてください!