Python matplotlib.pyplotを使う
2026/08/01

グラフ作成はデータ整理の基本

  • データとして数値を扱う場合グラフ化は必須です。学生時代が理系の方は、実験レポート等で「叩き込まれて」いますよね。例えば2値のデータがあるとしましょう。
    項目値
    A2143
    B4286
  • この表を見せるだけだと「値が2個ある」の認識で終わるかもしれません。しかし、気付いている方もいると思いますが、BはAの2倍です。

  • これをグラフにしてみましょう。2個のグラフを作成しました。
    グラフ1グラフ2
  • 同じ数値の棒グラフですが、明らかに意味が違いますね。グラフ1はAとBの大小関係を視覚化していますが、グラフ2は取り得る値のレンジから大小関係には着目していないことを示しています。

  • 実のある議論をするには、前提条件を揃えることが必須です。多くの場合データはその起点となりますが、解釈が異なると議論は平行線をたどります(*1)。グラフは認識を一致させるための強力なツールなのです。

データを自動でグラフ化: matplotlib.pyplot

  • すると採取データは常にグラフ化したいわけですが、定期/定点観測データ採取等の場合、グラフ化の作業時間も馬鹿になりません。当然自動化したいと考えるようになります。

  • Python系だと matplotlib.pyplot が最も多く紹介されているので、これを習得することにしました。

  • まずインストールです: pip install matplotlib。
  • ライブラリの利用は下記です。pltでaliasするのも公式作法のようです。
    import matplotlib.pyplot as plt
    
  • 先程の棒グラフを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ファイルなどにセーブできるので、グラフを入れたレポートも自動で生成できそうです。

(*1)時間浪費の主たる原因。追加説明ではダメ。認識できなかったことを認めたい人はいないから。

Copyright(C) 2026 Altmo
本HPについて