📋 このステップで学ぶこと
- 実データを使った総合演習の進め方
- 複数データの比較グラフ作成テクニック
- カスタマイズを駆使した美しいグラフ
- ダッシュボード風レイアウトの作成
- 実務で使えるグラフテンプレート
- STEP 6〜11のMatplotlib総まとめ
🎓 1. これまでの復習
なぜ総合演習が必要なのか
STEP 6〜11で、Matplotlibの様々な機能を個別に学んできました。しかし、実際の仕事では複数の機能を組み合わせて使います。
このステップでは、これまで学んだスキルを統合して、実務で使えるレベルのグラフを作成します。料理に例えると、食材の切り方、炒め方、味付けを個別に学んだ後、実際に「一品の料理」を完成させる段階です。
学んだスキルのチェックリスト
✅ STEP 6-11で学んだこと
| STEP |
学んだ内容 |
主な関数・メソッド |
| STEP 6 |
Matplotlibの基本 |
plot(), scatter(), bar(), hist() |
| STEP 7 |
カスタマイズ基礎 |
color, linewidth, marker, alpha |
| STEP 8 |
複数グラフ配置 |
subplots(), axes[i, j] |
| STEP 9 |
タイトル・軸・凡例 |
set_title(), set_xlabel(), legend() |
| STEP 10 |
注釈と矢印 |
text(), annotate(), arrowprops |
| STEP 11 |
保存とエクスポート |
savefig(), dpi, bbox_inches |
💡 このステップの進め方
各演習はステップバイステップで進めます。
- 課題の理解:何を作るか、完成イメージを把握
- データの準備:グラフに使うデータを用意
- 基本グラフの作成:まずはシンプルに描画
- カスタマイズ:色、フォント、注釈を追加
- 仕上げと保存:レイアウト調整、高品質で保存
📊 2. 実践演習1: 月別売上分析ダッシュボード
課題の確認
🎯 作成するグラフ
2023年と2024年の月別売上を比較するダッシュボードを作成します。
| 配置 |
グラフの種類 |
表示する内容 |
| 左側 |
折れ線グラフ |
2023年と2024年の売上推移を比較 |
| 右側 |
棒グラフ |
前年比成長率(%) |
重要なポイント(最高値、最大成長率)には注釈を追加します。
ステップ1: データの準備
まずは、グラフに使うデータを準備します。実務では、CSVファイルやデータベースから読み込むことが多いですが、ここではPythonのリストで直接定義します。
📝 コードの解説
以下のコードで、月名、2年分の売上データ、前年比を準備します。
【各行の意味】
import matplotlib.pyplot as plt # グラフ描画ライブラリを読み込む
import numpy as np # 数値計算ライブラリを読み込む
months = [‘1月’, ‘2月’, …] # X軸に使う月の名前(リスト)
sales_2023 = [100, 120, …] # 2023年の売上データ(単位: 万円)
sales_2024 = [110, 140, …] # 2024年の売上データ(単位: 万円)
# 前年比の計算
growth_rate = [(s24 – s23) / s23 * 100 for …]
↑ リスト内包表記を使って、各月の成長率(%)を計算
↑ 計算式: (今年 – 去年) ÷ 去年 × 100
▼ 入力するコード
import matplotlib.pyplot as plt
import numpy as np
# データの準備
months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’]
sales_2023 = [100, 120, 150, 130, 160, 180]
sales_2024 = [110, 140, 170, 160, 190, 220]
# 前年比を計算(リスト内包表記)
growth_rate = [(s24 – s23) / s23 * 100
for s23, s24 in zip(sales_2023, sales_2024)]
print(“データ準備完了!”)
print(f”前年比: {growth_rate}”)
▼ 実行結果
データ準備完了!
前年比: [10.0, 16.666666666666668, 13.333333333333334, 23.076923076923077, 18.75, 22.22222222222222]
ステップ2: 図とsubplotsの作成
次に、グラフを描く「キャンバス」を用意します。今回は1行2列のレイアウト(左右に2つのグラフ)を作成します。
【コードの意味】
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
├─ fig : 図全体を管理するオブジェクト
├─ axes : 各グラフを管理する配列(axes[0]が左、axes[1]が右)
├─ 1, 2 : 1行 × 2列 のレイアウト
└─ figsize : 図全体のサイズ(幅16インチ × 高さ6インチ)
【axesの構造】
axes[0] → 左側のグラフ領域
axes[1] → 右側のグラフ領域
▼ 入力するコード
# 1行2列のsubplotsを作成
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
print(“subplots作成完了!”)
print(f”axesの形状: {len(axes)}個のグラフ領域”)
ステップ3: 左側に折れ線グラフを描く
左側のグラフ(axes[0])に、2023年と2024年の売上推移を折れ線グラフで描きます。2つの線を重ねることで、比較しやすくなります。
【plotのパラメータ解説】
axes[0].plot(months, sales_2023, # X軸(月)とY軸(売上)のデータ
marker=’o’, # 各点に丸いマーカーを表示
linewidth=2.5, # 線の太さ(2.5ポイント)
markersize=8, # マーカーのサイズ(8ポイント)
color=’steelblue’, # 線の色(鉄青色)
label=’2023年’, # 凡例に表示する名前
alpha=0.8) # 透明度(0.8 = 少し透明)
【マーカーの種類】
‘o’ → 丸 ‘s’ → 四角 ‘^’ → 三角 ‘D’ → ダイヤ
【なぜalpha=0.8なのか】
完全に不透明(1.0)だと硬い印象になる。
少し透明にすることで、柔らかく見やすい印象に。
▼ 入力するコード
# 左側: 折れ線グラフ
# 2023年のデータ
axes[0].plot(months, sales_2023,
marker=’o’,
linewidth=2.5,
markersize=8,
color=’steelblue’,
label=’2023年’,
alpha=0.8)
# 2024年のデータ
axes[0].plot(months, sales_2024,
marker=’s’,
linewidth=2.5,
markersize=8,
color=’coral’,
label=’2024年’,
alpha=0.8)
# タイトルと軸ラベル
axes[0].set_title(‘年度別売上推移’,
fontsize=16,
fontweight=’bold’,
pad=15)
axes[0].set_xlabel(‘月’, fontsize=13, fontweight=’bold’)
axes[0].set_ylabel(‘売上(万円)’, fontsize=13, fontweight=’bold’)
# 凡例
axes[0].legend(loc=’upper left’,
fontsize=11,
frameon=True,
shadow=True)
# グリッド
axes[0].grid(True, linestyle=’–‘, alpha=0.4)
print(“折れ線グラフ完成!”)
ステップ4: 右側に棒グラフを描く
右側のグラフ(axes[1])に、前年比成長率を棒グラフで描きます。成長率が15%以上なら緑、それ未満なら黄色で色分けします。
【条件による色分けの解説】
colors = [‘lightgreen’ if g > 15 else ‘gold’ for g in growth_rate]
↑ リスト内包表記 + 条件式
↑ 意味: growth_rateの各値gについて
g > 15 なら ‘lightgreen’(緑)
そうでなければ ‘gold’(黄色)
【具体例】
growth_rate = [10.0, 16.7, 13.3, 23.1, 18.8, 22.2]
colors = [黄, 緑, 黄, 緑, 緑, 緑 ]
【axhlineの解説】
axes[1].axhline(y=15, …) # 水平な基準線を引く
↑ y=15の位置に赤い破線を引いて「目標15%」を示す
▼ 入力するコード
# 右側: 棒グラフ(前年比)
# 成長率15%以上なら緑、未満なら黄色
colors = [‘lightgreen’ if g > 15 else ‘gold’ for g in growth_rate]
bars = axes[1].bar(months, growth_rate,
color=colors,
edgecolor=’black’,
linewidth=1.5,
alpha=0.8)
# タイトルと軸ラベル
axes[1].set_title(‘前年比成長率’,
fontsize=16,
fontweight=’bold’,
pad=15)
axes[1].set_xlabel(‘月’, fontsize=13, fontweight=’bold’)
axes[1].set_ylabel(‘成長率(%)’, fontsize=13, fontweight=’bold’)
# グリッド(Y軸のみ)
axes[1].grid(True, axis=’y’, linestyle=’–‘, alpha=0.4)
# 基準線(15%)を追加
axes[1].axhline(y=15, color=’red’, linestyle=’–‘,
linewidth=2, alpha=0.6, label=’目標15%’)
axes[1].legend(loc=’upper right’, fontsize=10)
print(“棒グラフ完成!”)
ステップ5: 注釈の追加
グラフの重要なポイントに注釈(アノテーション)を追加します。注釈があると、見る人が「どこを見ればいいか」が一目でわかります。
【annotateのパラメータ解説】
axes[0].annotate(
‘過去最高!\n220万円’, # 表示するテキスト(\nで改行)
xy=(5, 220), # 矢印が指す位置(6月=インデックス5, 値=220)
xytext=(3.5, 205), # テキストを表示する位置
fontsize=11, # 文字サイズ
color=’red’, # 文字色
fontweight=’bold’, # 太字
bbox=dict( # テキストを囲むボックス
boxstyle=’round,pad=0.6′, # 角丸、余白0.6
facecolor=’yellow’, # 背景色
alpha=0.9, # 透明度
edgecolor=’red’, # 枠線の色
linewidth=2 # 枠線の太さ
),
arrowprops=dict( # 矢印の設定
arrowstyle=’->’, # 矢印のスタイル
color=’red’, # 矢印の色
lw=2, # 矢印の太さ
connectionstyle=’arc3,rad=0.3′ # 曲線の矢印
)
)
▼ 入力するコード
# 左側グラフに注釈(2024年6月の最高値)
axes[0].annotate(
‘過去最高!\n220万円’,
xy=(5, 220),
xytext=(3.5, 205),
fontsize=11,
color=’red’,
fontweight=’bold’,
bbox=dict(
boxstyle=’round,pad=0.6′,
facecolor=’yellow’,
alpha=0.9,
edgecolor=’red’,
linewidth=2
),
arrowprops=dict(
arrowstyle=’->’,
color=’red’,
lw=2,
connectionstyle=’arc3,rad=0.3′
)
)
# 右側グラフに注釈(最大の成長率)
max_growth_idx = growth_rate.index(max(growth_rate))
axes[1].annotate(
f’最大成長\n{growth_rate[max_growth_idx]:.1f}%’,
xy=(max_growth_idx, growth_rate[max_growth_idx]),
xytext=(max_growth_idx – 1, growth_rate[max_growth_idx] + 3),
fontsize=10,
color=’darkgreen’,
fontweight=’bold’,
arrowprops=dict(
arrowstyle=’->’,
color=’darkgreen’,
lw=1.5
)
)
print(“注釈追加完了!”)
ステップ6: 全体タイトルと保存
最後に、ダッシュボード全体のタイトルを追加し、レイアウトを調整して保存します。
【仕上げのコード解説】
plt.suptitle(…) # 図全体のタイトル(supはsuperの略)
# y=0.98で位置を少し下げる(重なり防止)
plt.tight_layout() # 各グラフが重ならないよう自動調整
plt.savefig(
‘sales_dashboard.png’, # ファイル名
dpi=300, # 解像度(300dpiは印刷品質)
bbox_inches=’tight’, # 余白を最小限に
pad_inches=0.2 # 端に少し余白を追加
)
▼ 入力するコード
# 全体タイトル
plt.suptitle(‘📊 2024年 月別売上分析ダッシュボード’,
fontsize=20,
fontweight=’bold’,
y=0.98)
# レイアウト調整
plt.tight_layout()
# 保存
plt.savefig(‘sales_dashboard.png’,
dpi=300,
bbox_inches=’tight’,
pad_inches=0.2)
plt.show()
print(“✅ 完成!sales_dashboard.pngとして保存されました。”)
完成版コード(まとめ)
ここまでのコードをまとめた完成版です。このコードをそのままコピーして実行すれば、ダッシュボードが完成します。
※ コードが長い場合は横スクロールできます
import matplotlib.pyplot as plt
import numpy as np
# ===== データの準備 =====
months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’]
sales_2023 = [100, 120, 150, 130, 160, 180]
sales_2024 = [110, 140, 170, 160, 190, 220]
growth_rate = [(s24 – s23) / s23 * 100
for s23, s24 in zip(sales_2023, sales_2024)]
# ===== 図とsubplotsの作成 =====
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
# ===== 左側: 折れ線グラフ =====
axes[0].plot(months, sales_2023, marker=’o’, linewidth=2.5,
markersize=8, color=’steelblue’, label=’2023年’, alpha=0.8)
axes[0].plot(months, sales_2024, marker=’s’, linewidth=2.5,
markersize=8, color=’coral’, label=’2024年’, alpha=0.8)
axes[0].set_title(‘年度別売上推移’, fontsize=16, fontweight=’bold’, pad=15)
axes[0].set_xlabel(‘月’, fontsize=13, fontweight=’bold’)
axes[0].set_ylabel(‘売上(万円)’, fontsize=13, fontweight=’bold’)
axes[0].legend(loc=’upper left’, fontsize=11, frameon=True, shadow=True)
axes[0].grid(True, linestyle=’–‘, alpha=0.4)
# 注釈(最高値)
axes[0].annotate(‘過去最高!\n220万円’, xy=(5, 220), xytext=(3.5, 205),
fontsize=11, color=’red’, fontweight=’bold’,
bbox=dict(boxstyle=’round,pad=0.6′, facecolor=’yellow’,
alpha=0.9, edgecolor=’red’, linewidth=2),
arrowprops=dict(arrowstyle=’->’, color=’red’, lw=2,
connectionstyle=’arc3,rad=0.3′))
# ===== 右側: 棒グラフ =====
colors = [‘lightgreen’ if g > 15 else ‘gold’ for g in growth_rate]
axes[1].bar(months, growth_rate, color=colors, edgecolor=’black’,
linewidth=1.5, alpha=0.8)
axes[1].set_title(‘前年比成長率’, fontsize=16, fontweight=’bold’, pad=15)
axes[1].set_xlabel(‘月’, fontsize=13, fontweight=’bold’)
axes[1].set_ylabel(‘成長率(%)’, fontsize=13, fontweight=’bold’)
axes[1].grid(True, axis=’y’, linestyle=’–‘, alpha=0.4)
axes[1].axhline(y=15, color=’red’, linestyle=’–‘, linewidth=2,
alpha=0.6, label=’目標15%’)
axes[1].legend(loc=’upper right’, fontsize=10)
# 注釈(最大成長)
max_idx = growth_rate.index(max(growth_rate))
axes[1].annotate(f’最大成長\n{growth_rate[max_idx]:.1f}%’,
xy=(max_idx, growth_rate[max_idx]),
xytext=(max_idx – 1, growth_rate[max_idx] + 3),
fontsize=10, color=’darkgreen’, fontweight=’bold’,
arrowprops=dict(arrowstyle=’->’, color=’darkgreen’, lw=1.5))
# ===== 仕上げ =====
plt.suptitle(‘📊 2024年 月別売上分析ダッシュボード’,
fontsize=20, fontweight=’bold’, y=0.98)
plt.tight_layout()
plt.savefig(‘sales_dashboard.png’, dpi=300, bbox_inches=’tight’, pad_inches=0.2)
plt.show()
📈 3. 実践演習2: データ分布の可視化
課題の確認
🎯 作成するグラフ
テストの点数データを使って、2×2のダッシュボードを作成します。
| 位置 |
グラフの種類 |
表示する内容 |
| 左上 |
ヒストグラム |
数学の点数分布 |
| 右上 |
箱ひげ図 |
数学と英語の比較 |
| 左下 |
散布図 |
数学と英語の相関 |
| 右下 |
折れ線グラフ |
上位10人の点数 |
重要なポイント解説
📊 2×2レイアウトでのaxesの指定方法
2×2のレイアウトでは、axes[行, 列]で各グラフを指定します。
【2×2レイアウトの構造】
fig, axes = plt.subplots(2, 2, figsize=(14, 12))
axes[0, 0] → 左上(1行目、1列目)
axes[0, 1] → 右上(1行目、2列目)
axes[1, 0] → 左下(2行目、1列目)
axes[1, 1] → 右下(2行目、2列目)
【視覚的なイメージ】
┌─────────────┬─────────────┐
│ axes[0,0] │ axes[0,1] │
│ 左上 │ 右上 │
├─────────────┼─────────────┤
│ axes[1,0] │ axes[1,1] │
│ 左下 │ 右下 │
└─────────────┴─────────────┘
📝 箱ひげ図(boxplot)の解説
箱ひげ図は、データの分布を視覚化するグラフです。
【箱ひげ図の構造】
─┬─ ← 最大値(ひげの上端)
│
┌┴┐ ← 第3四分位数(75%)
│ │
├─┤ ← 中央値(50%)
│ │
└┬┘ ← 第1四分位数(25%)
│
─┴─ ← 最小値(ひげの下端)
【コードのポイント】
bp = axes[0, 1].boxplot(
[math_scores, english_scores], # 2つのデータを比較
labels=[‘数学’, ‘英語’], # 各箱のラベル
patch_artist=True # 箱に色を塗れるようにする
)
bp[‘boxes’][0].set_facecolor(‘steelblue’) # 1つ目の箱を青に
bp[‘boxes’][1].set_facecolor(‘coral’) # 2つ目の箱をサンゴ色に
完成版コード
※ コードが長い場合は横スクロールできます
import matplotlib.pyplot as plt
import numpy as np
# ===== データ生成 =====
np.random.seed(42) # 再現性のために乱数シードを固定
math_scores = np.random.normal(70, 15, 100) # 平均70、標準偏差15、100人分
english_scores = np.random.normal(65, 12, 100) # 平均65、標準偏差12、100人分
# ===== 図とsubplots(2×2) =====
fig, axes = plt.subplots(2, 2, figsize=(14, 12))
# ===== 左上: ヒストグラム =====
axes[0, 0].hist(math_scores, bins=20, color=’steelblue’,
edgecolor=’black’, alpha=0.7)
axes[0, 0].axvline(math_scores.mean(), color=’red’, linestyle=’–‘,
linewidth=2, label=f’平均: {math_scores.mean():.1f}点’)
axes[0, 0].set_title(‘数学の点数分布’, fontsize=14, fontweight=’bold’)
axes[0, 0].set_xlabel(‘点数’, fontsize=12)
axes[0, 0].set_ylabel(‘人数’, fontsize=12)
axes[0, 0].legend(loc=’upper left’, fontsize=10)
axes[0, 0].grid(True, axis=’y’, alpha=0.3)
# ===== 右上: 箱ひげ図 =====
bp = axes[0, 1].boxplot([math_scores, english_scores],
labels=[‘数学’, ‘英語’],
patch_artist=True, widths=0.6)
bp[‘boxes’][0].set_facecolor(‘steelblue’)
bp[‘boxes’][1].set_facecolor(‘coral’)
for box in bp[‘boxes’]:
box.set_alpha(0.7)
axes[0, 1].set_title(‘教科別点数の比較’, fontsize=14, fontweight=’bold’)
axes[0, 1].set_ylabel(‘点数’, fontsize=12)
axes[0, 1].grid(True, axis=’y’, alpha=0.3)
# ===== 左下: 散布図 =====
axes[1, 0].scatter(math_scores, english_scores, s=50,
alpha=0.6, color=’purple’, edgecolors=’black’)
axes[1, 0].set_title(‘数学と英語の相関’, fontsize=14, fontweight=’bold’)
axes[1, 0].set_xlabel(‘数学の点数’, fontsize=12)
axes[1, 0].set_ylabel(‘英語の点数’, fontsize=12)
axes[1, 0].grid(True, alpha=0.3)
# 相関係数を計算して表示
correlation = np.corrcoef(math_scores, english_scores)[0, 1]
axes[1, 0].text(0.05, 0.95, f’相関係数: {correlation:.2f}’,
transform=axes[1, 0].transAxes,
fontsize=11, fontweight=’bold’,
verticalalignment=’top’,
bbox=dict(boxstyle=’round’, facecolor=’wheat’, alpha=0.8))
# ===== 右下: 折れ線グラフ =====
top_10_math = np.sort(math_scores)[-10:]
top_10_english = np.sort(english_scores)[-10:]
x_pos = np.arange(1, 11)
axes[1, 1].plot(x_pos, sorted(top_10_math), marker=’o’,
linewidth=2, markersize=6, color=’steelblue’,
label=’数学’, alpha=0.8)
axes[1, 1].plot(x_pos, sorted(top_10_english), marker=’s’,
linewidth=2, markersize=6, color=’coral’,
label=’英語’, alpha=0.8)
axes[1, 1].set_title(‘上位10人の点数’, fontsize=14, fontweight=’bold’)
axes[1, 1].set_xlabel(‘順位’, fontsize=12)
axes[1, 1].set_ylabel(‘点数’, fontsize=12)
axes[1, 1].legend(loc=’lower right’, fontsize=10)
axes[1, 1].grid(True, alpha=0.3)
# ===== 仕上げ =====
plt.suptitle(‘📚 テスト結果分析ダッシュボード’,
fontsize=18, fontweight=’bold’, y=0.98)
plt.tight_layout()
plt.savefig(‘test_analysis.png’, dpi=300, bbox_inches=’tight’, pad_inches=0.2)
plt.show()
🏪 4. 実践演習3: 店舗別売上比較
課題の確認
🎯 作成するグラフ
3店舗の月別売上を比較する折れ線グラフを作成します。
- 3つの線を重ねて表示
- 各店舗で異なるマーカーと色を使用
- 最高値に注釈を追加
- 統計情報(平均値)をテキストボックスで表示
重要なポイント解説
📝 テキストボックスの追加方法
グラフ上に統計情報などを表示するテキストボックスの追加方法です。
【text()のパラメータ解説】
plt.text(
0.02, 0.98, # 位置(0〜1の相対座標)
info_text, # 表示するテキスト
transform=plt.gca().transAxes, # 座標を相対座標として扱う
fontsize=11, # 文字サイズ
verticalalignment=’top’, # 上揃え
bbox=dict( # テキストを囲むボックス
boxstyle=’round’, # 角丸
facecolor=’white’, # 背景色
alpha=0.9, # 透明度
edgecolor=’gray’, # 枠線の色
linewidth=1.5 # 枠線の太さ
),
family=’monospace’ # 等幅フォント(数値が揃う)
)
【transformの意味】
transform=plt.gca().transAxes を指定すると、
座標が「データの値」ではなく「グラフ領域の割合」になる。
(0, 0) = 左下、(1, 1) = 右上
(0.02, 0.98) = 左上から少し内側
完成版コード
※ コードが長い場合は横スクロールできます
import matplotlib.pyplot as plt
import numpy as np
# ===== データ =====
months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’]
store_a = [120, 135, 150, 145, 160, 175] # 駅前店(好調)
store_b = [100, 115, 140, 135, 155, 170] # 郊外店(安定)
store_c = [90, 100, 110, 120, 130, 140] # 新規店(成長中)
# カラーパレット(辞書で管理)
colors = {
‘A店’: ‘steelblue’,
‘B店’: ‘coral’,
‘C店’: ‘lightgreen’
}
# ===== グラフ作成 =====
plt.figure(figsize=(14, 8))
# 各店舗のデータをプロット
plt.plot(months, store_a, marker=’o’, linewidth=3,
markersize=10, color=colors[‘A店’],
label=’A店(駅前店)’, alpha=0.8)
plt.plot(months, store_b, marker=’s’, linewidth=3,
markersize=10, color=colors[‘B店’],
label=’B店(郊外店)’, alpha=0.8)
plt.plot(months, store_c, marker=’^’, linewidth=3,
markersize=10, color=colors[‘C店’],
label=’C店(新規店)’, alpha=0.8)
# タイトルと軸ラベル
plt.title(‘店舗別月間売上推移’, fontsize=20, fontweight=’bold’, pad=20)
plt.xlabel(‘月’, fontsize=15, fontweight=’bold’, labelpad=10)
plt.ylabel(‘売上(万円)’, fontsize=15, fontweight=’bold’, labelpad=10)
# 凡例
plt.legend(loc=’upper left’, fontsize=13, frameon=True,
shadow=True, fancybox=True)
# グリッド
plt.grid(True, linestyle=’–‘, alpha=0.4, linewidth=0.8)
# ===== 注釈: A店の最高値 =====
plt.annotate(‘A店トップ!\n175万円’,
xy=(5, 175),
xytext=(3.5, 168),
fontsize=12,
color=colors[‘A店’],
fontweight=’bold’,
bbox=dict(boxstyle=’round,pad=0.6′,
facecolor=’lightyellow’,
alpha=0.9,
edgecolor=colors[‘A店’],
linewidth=2),
arrowprops=dict(arrowstyle=’->’,
color=colors[‘A店’],
lw=2))
# ===== 統計情報テキストボックス =====
info_text = f”””📊 統計情報
A店平均: {np.mean(store_a):.1f}万円
B店平均: {np.mean(store_b):.1f}万円
C店平均: {np.mean(store_c):.1f}万円”””
plt.text(0.02, 0.98, info_text,
transform=plt.gca().transAxes,
fontsize=11,
verticalalignment=’top’,
bbox=dict(boxstyle=’round’, facecolor=’white’,
alpha=0.9, edgecolor=’gray’, linewidth=1.5),
family=’monospace’)
# ===== 仕上げ =====
plt.tight_layout()
plt.savefig(‘store_comparison.png’, dpi=300, bbox_inches=’tight’, pad_inches=0.2)
plt.show()
📝 STEP 12 のまとめ
✅ このステップで学んだこと
| トピック |
学んだ内容 |
| ダッシュボード作成 |
複数グラフを効果的に配置する方法 |
| データ比較 |
2年分のデータ、複数店舗のデータを重ねて表示 |
| 条件による色分け |
リスト内包表記で条件に応じた色を設定 |
| 注釈の活用 |
重要ポイントにannotateで矢印付き注釈を追加 |
| 統計情報の表示 |
textで平均値などの情報をボックス表示 |
| 2×2レイアウト |
axes[行, 列]での各グラフの指定方法 |
🎓 Matplotlib完全マスター達成!
おめでとうございます!このステップでMatplotlibの基礎から応用までを完全にマスターしました。
プロット、カスタマイズ、レイアウト、注釈、保存まで、実務で必要なすべてのスキルを習得しました。次のステップからは、Seabornを使って、さらに美しく統計的なグラフ作成を学んでいきます!
📝 チャレンジ課題
チャレンジ 1
応用
自分でデータを作成し、2×2のダッシュボードを作成してください。異なる4種類のグラフを使いましょう。
【ヒント】
- 左上: 折れ線グラフ(時系列データ)
- 右上: 棒グラフ(カテゴリ別比較)
- 左下: 散布図(2変数の関係)
- 右下: ヒストグラム(分布)
- 各グラフにタイトル、軸ラベル、グリッドを追加
- 全体タイトルをsuptitle()で設定
- tight_layout()で余白を調整
チャレンジ 2
発展
売上データに季節性があると仮定して、注釈で夏季と冬季の特徴を説明してください。
【ヒント】
- 6〜8月を「夏季」、12〜2月を「冬季」として色分け
- axvspan()で背景色を追加(夏は黄色、冬は青)
- annotate()で「夏季ピーク」「冬季底」などのラベル
- text()で季節ごとの平均値を表示
axvspanの使い方: plt.axvspan(5, 7, alpha=0.2, color=’yellow’)
チャレンジ 3
プロ級
企業の財務データ(売上、利益、費用)を使って、プロ仕様のダッシュボードを作成してください。
【ヒント】
- 3×2のレイアウトを使用(6つのグラフ)
- 売上推移、利益率、費用内訳、ROI、キャッシュフロー、予実比較
- 統一されたカラーパレット(例: 青系)を使用
- 各グラフに適切な注釈を追加
- 全体的にプロフェッショナルな見た目に
- dpi=300で保存
❓ よくある質問
Q1: ダッシュボードのレイアウトはどう決めるべきですか?
重要度と関連性で決めましょう。左上が最も目立つので、最重要なグラフを配置します。関連するグラフは隣同士に配置すると比較しやすくなります。例えば、売上推移と利益推移を左右に並べると、両者の関係が見やすくなります。また、時系列データは上段、詳細データは下段という配置も効果的です。
Q2: 色の選び方で迷います。どうすればいいですか?
用途に応じた配色を選びましょう。比較なら対照的な色(青とオレンジ)、連続データなら同系色のグラデーション。良い/悪いは緑/赤。迷ったら、steelblue、coral、lightgreenの組み合わせが無難です。また、色覚異常の方への配慮として、赤と緑の組み合わせは避けましょう。
Q3: グラフが多すぎて見づらくなります。どうすればいいですか?
情報を絞り込みましょう。1つのダッシュボードには4〜6個のグラフが適切です。それ以上必要なら、複数のダッシュボードに分けるか、figsizeを大きくしましょう(figsize=(18, 12)など)。また、各グラフで伝えたいメッセージを1つに絞ることも重要です。
Q4: 実務ではどのようなダッシュボードが求められますか?
「一目で状況がわかる」ことが重要です。経営層向けなら、売上・利益・コストの推移と達成率。営業向けなら、商品別・地域別の実績と予実比較。マーケティング向けなら、チャネル別効果と顧客分析。誰が見るかを意識して、必要な情報を選びましょう。
Q5: コードが長くなって管理が大変です。どうすればいいですか?
関数化とコメントで整理しましょう。例えば、def create_line_chart(ax, data, title):のように、各グラフを関数にまとめると再利用しやすくなります。また、# ===== 左上: ヒストグラム =====のようなセクションコメントを入れると、コードの見通しが良くなります。
artnasekai
#artnasekai #学習メモ