第 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(行, 列) の数字を変えるだけで、構造はそのままです。
見やすいグラフを作るための工夫についても深く学びたい
見やすさのコツは、おおよそ次のような点を押さえると安定します。
- タイトル・軸ラベル・単位を必ず付ける(何のグラフか一目で分かる)
- 凡例は系列が複数あるときに必須
- 色のコントラストを意識する(薄い色同士は重なると見えにくい)
- 軸の範囲を
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= を試してみてください。