グラフ作成はデータ整理の基本
- データとして数値を扱う場合グラフ化は必須です。学生時代が理系の方は、実験レポート等で「叩き込まれて」いますよね。例えば2値のデータがあるとしましょう。
- この表を見せるだけだと「値が2個ある」の認識で終わるかもしれません。しかし、気付いている方もいると思いますが、BはAの2倍です。
- これをグラフにしてみましょう。2個のグラフを作成しました。
| グラフ1 | グラフ2 |
|---|
 |  |
- 同じ数値の棒グラフですが、明らかに意味が違いますね。
グラフ1はAとBの大小関係を視覚化していますが、グラフ2は取り得る値のレンジから大小関係には着目していないことを示しています。
- 実のある議論をするには、前提条件を揃えることが必須です。多くの場合データはその起点となりますが、解釈が異なると議論は平行線をたどります(*1)。グラフは認識を一致させるための強力なツールなのです。
データを自動でグラフ化: matplotlib.pyplot
import matplotlib.pyplot as plt
# フォント指定
plt.rcParams['font.family'] = ['Consolas', 'Meiryo UI']
# データ
x = ['A', 'B'] # Xの値(ラベル)
y = [2143, 4286] # Yの値
# figureとaxの取得
fig, axs = plt.subplots(1, 2, figsize=(5, 2.5)) # 1行2列, 5 x 2.5[in]
# ax共通設定
for ax in axs:
bars = ax.bar(x, y, width=0.5) # 棒グラフ, x/yの値, 棒の太さ
ax.bar_label(bars) # 棒の値表示
ax.grid(True, axis='y') # Y軸補助目盛線有効
# グラフ毎個別設定
axs[0].set_title('グラフ1')
axs[0].set_ylim(0, 5000) # Y軸最大値
axs[1].set_title('グラフ2')
axs[1].set_ylim(0, 50000) # Y軸最大値
# レイアウト調整
fig.tight_layout()
# 表示
plt.show()
- ちょっと長いですね。少しずつ変更していきましょう。
棒グラフを例にpyplotを使ってみる
- まずはグラフ1の棒グラフをプロットしてみましょう。とりあえずプロットして、少しずつ設定を追加していきます。
# グラフ1のプロット
import matplotlib.pyplot as plt
x = ['A', 'B'] # X値(ラベル)
y = [2143, 4286] # Y値
fig, ax = plt.subplots() # figure, ax取得
ax.bar(x, y) # 棒グラフ(bar)とx,y指定
plt.show() # 表示
|
|
# width指定で線(bar)を細く
import matplotlib.pyplot as plt
x = ['A', 'B']
y = [2143, 4286]
fig, ax = plt.subplots()
ax.bar(x, y, width=0.5) # width指定追加
plt.show()
|
|
# Y軸目盛線補助線追加
import matplotlib.pyplot as plt
x = ['A', 'B']
y = [2143, 4286]
fig, ax = plt.subplots()
ax.bar(x, y, width=0.5)
ax.grid(True, axis='y') # Y軸補助目盛線有効
plt.show()
|
|
# Y軸目盛最小/最大値指定
import matplotlib.pyplot as plt
x = ['A', 'B']
y = [2143, 4286]
fig, ax = plt.subplots()
ax.bar(x, y, width=0.5)
ax.grid(True, axis='y')
ax.set_ylim(0, 5000) # Y軸最小,最大値指定
plt.show()
|
|
# グラフタイトルとフォント指定
import matplotlib.pyplot as plt
# フォント指定('Consolas'に無い文字は'Meiryo UI'適用)
plt.rcParams['font.family'] = ['Consolas', 'Meiryo UI']
x = ['A', 'B']
y = [2143, 4286]
fig, ax = plt.subplots()
ax.bar(x, y, width=0.5)
ax.grid(True, axis='y')
ax.set_ylim(0, 5000)
ax.set_title('グラフ1') # グラフタイトル追加
plt.show()
|
|
複数のplotを入れる
- これで単一の棒グラフについて大体設定できるようになったと思います。後はこれを横に2個並べるわけですが、
plt.subplots()で、プロット領域の個数と大きさを指定することができます。
- 例えば下記は、1行,2列でプロットを横に並べて、その大きさに5 x 2.5[inch]を指定しています。
fig, axs = plt.subplots(1, 2, figsize=(5, 2.5)) # 1行2列, 5 x 2.5[in]
- 上記記述の
axs変数は、axes(プロット領域)のオブジェクト配列です。今回の例では1行に2個なので1次元listとして、各axesオブジェクトにアクセスできます。fig, axs = plt.subplots(1, 2, figsize=(5, 2.5)) # 1行2列, 5 x 2.5[in]
ax[0].bar(x, y)
ax[1].bar(x, y)
- 尚2行2列等の場合は、2次元表記です。※ここ、混乱しやすいですね...
fig, axs = plt.subplots(2, 2, figsize=(5, 2.5)) # 1行2列, 5 x 2.5[in]
ax[0, 0].bar(x, y) #
ax[0, 1].bar(x, y) # [0, 0] [0, 1]
ax[1, 0].bar(x, y) # [1, 0] [1, 1]
ax[1, 1].bar(x, y) #
- 複数のaxesを持つfigureでは、レイアウト調整に
tight_layout()メソッドを使用するのが楽です。fig.tight_layout()
- これらを入れ込んだのが、最初に示したソースコードです。
import matplotlib.pyplot as plt
# フォント指定('Consolas'に無い文字は'Meiryo UI'適用)
plt.rcParams['font.family'] = ['Consolas', 'Meiryo UI']
# データ
x = ['A', 'B'] # Xの値(ラベル)
y = [2143, 4286] # Yの値
# figureとaxの取得
fig, axs = plt.subplots(1, 2, figsize=(5, 2.5)) # 1行2列, 5 x 2.5[in]
# ax共通設定
for ax in axs:
bars = ax.bar(x, y, width=0.5) # 棒グラフ, x/yの値, 棒の太さ
ax.bar_label(bars) # 棒の値表示
ax.grid(True, axis='y') # Y軸補助目盛線有効
# グラフ毎個別設定
axs[0].set_title('グラフ1')
axs[0].set_ylim(0, 5000) # Y軸最大値
axs[1].set_title('グラフ2')
axs[1].set_ylim(0, 50000) # Y軸最大値
# レイアウト調整
fig.tight_layout()
# 表示
plt.show()
|
|
Anatomy of a figure
- matplotlibのサイトで設定に使用するメソッドをわかりやすく表記してくれています。
 クリックで拡大
最後に通常のプロット
- ここまで棒グラフを例に書きましたが、技術系で最も多いのは(x,y)の値組み合わせプロットです。簡単な例を示します。
import matplotlib.pyplot as plt
import random
# 適当なxとyの値準備する
Xs = [idx*1.0 for idx in range(0, 101)]
Y0 = [(x**0.5) for x in Xs]
Y1 = [(x**0.5)*(1.0 + 0.2*(random.random()-0.5)) for x in Xs]
fig, ax = plt.subplots(figsize=(3.0, 3.0))
ax.plot(Xs, Y1, 'o-', linewidth=1.0) # Plot
ax.plot(Xs, Y0, linewidth=3.0) # Line
# 目盛り範囲指定
ax.set_xlim(0, 100)
ax.set_ylim(0, 12)
# グラフタイトル(※MathJaxが使える)
ax.set_title(r"$y=\sqrt{x}$")
# 目盛線表示
ax.grid(True, axis='both')
# グラフ表示
plt.show()
|

|
- ざっくり使ってみましたが、凝らなくてもきれいな表示が良いですね。出来上がったグラフはpngファイルなどにセーブできるので、グラフを入れたレポートも自動で生成できそうです。
|