Skip to content

第 3 回 質問と回答

このページでは、第 3 回「データ可視化 (2)」に関して寄せられた質問と、それに対する回答をまとめています。質問者の氏名や学生番号は掲載せず、匿名で扱います。

質問の送り方

質問は 「📮 連絡フォーム」 または「各回の演習確認フォーム」からお寄せください。いただいた内容は、同様の疑問を持つ他の受講生にも役立つようこのページに随時追加していきます。


A. fig, ax スタイルと複数グラフについて

ax の使い方がわかっていないのでマスターしたいです

fig, ax スタイルは、慣れるほど柔軟な描画ができるようになります。よく使う基本パターンを覚えておくと十分です。

# 1 つのグラフ
fig, ax = plt.subplots()
ax.plot(x, y)

# 2x3 のグラフ(軸は axs[行, 列] でアクセス)
fig, axs = plt.subplots(2, 3, figsize=(15, 8))
axs[0, 0].plot(...)
axs[1, 2].bar(...)

# サイズ指定 + Y 軸を共有
fig, axs = plt.subplots(1, 2, figsize=(12, 5), sharey=True)

最後に plt.tight_layout() を入れておくと、ラベルがはみ出さないように自動調整してくれます。

複数のグラフを組み合わせて表示する部分が難しいと感じた。レイアウトや配置の設定が思ったようにいかず苦戦した

レイアウトが崩れるときの対処は、次の 3 つで大体解決します。

  • ラベルが切れる → plt.tight_layout() を最後に追加
  • 全体が小さい / 余白が窮屈 → figsize=(横, 縦) を大きく(例: (12, 8))
  • 軸の範囲がバラバラ → sharex=True / sharey=True で揃える

また、3 つ以上並べる場合も plt.subplots(行, 列) の数字を変えるだけで、構造はそのままです。

fig, axs = plt.subplots(2, 3, figsize=(15, 8))
axs[0, 0].plot(x, y1); axs[0, 0].set_title("A")
axs[0, 1].bar(c, v);   axs[0, 1].set_title("B")
axs[0, 2].hist(d);     axs[0, 2].set_title("C")
axs[1, 0].scatter(x, y2)
axs[1, 1].boxplot(d2)
axs[1, 2].pie(v2)
plt.tight_layout()
plt.show()

見やすいグラフを作るための工夫についても深く学びたい

見やすさのコツは、おおよそ次のような点を押さえると安定します。

  • タイトル・軸ラベル・単位を必ず付ける(何のグラフか一目で分かる)
  • 凡例は系列が複数あるときに必須
  • 色のコントラストを意識する(薄い色同士は重なると見えにくい)
  • 軸の範囲を set_xlim / set_ylim で整えて、無駄な空白や急峻な変化を抑える
  • 要素を増やしすぎない(1 枚のグラフに情報を詰め込まない)

第 3 回で紹介した Matplotlib のチートシート も、見やすいグラフ作りの参考になります。今後の講義(pandas や時系列分析の回など)でも、その都度具体例を挙げて取り上げていきます。


B. 箱ひげ図と分布データの生成について

箱ひげ図のプログラムから np を numpy に、randn を normal にし、()の中身は 100 のままの状態のものを 3 つに増やした。実行した結果、箱ひげ図が 1 つにまとまってしまった。... 正直何が違うのかあまりよくわかっていない

np.random.normal(100) のように引数を 1 つだけにすると、「平均 100、標準偏差 1(デフォルト)の値を 1 つ返す」という意味になります。これを 3 つ並べても、それぞれ「100 付近の値が 1 つだけ」のデータが 3 セットできるだけなので、箱ひげ図にはならず点状にまとまってしまいます。

np.random.normal() は 3 つの引数(平均、標準偏差、サンプル数)を指定するのが基本です。

# NG:1 つの値しか返らないので分布にならない
data = [
    np.random.normal(100),
    np.random.normal(100),
    np.random.normal(100),
]

# OK:平均・標準偏差・サンプル数を指定
data = [
    np.random.normal(100, 10, 100),
    np.random.normal(150, 15, 100),
    np.random.normal(200,  5, 100),
]

なお、randn と normal は別の関数です。np.random.randn(100) は「標準正規分布から 100 個生成」、np.random.normal(100) は「平均 100 の値を 1 個生成」になり、引数の意味がまったく違います。

箱ひげ図に名前を付けたくて、labels= を足したら、実行されたがエラーが出た。tick_labels にした方が良いという AI のアドバイスを受け、変更したところ、スムーズに実行された。何が違うのか

Matplotlib 3.9 以降で、boxplot() のラベル指定の引数名が labels= から tick_labels= に変更されました。意味は同じですが、新しいバージョンでは labels= を使うと警告やエラーが出ます。tick_labels= を試してみてください。

ax.boxplot(data, tick_labels=["A", "B", "C"])