matplotlib plot関数徹底解説:Pythonでグラフを描く方法


Matplotlib pyplot.plot 関数徹底解説:Pythonでグラフを描く方法

データ分析や科学計算において、結果の可視化は非常に重要です。Pythonでグラフを作成するための最も広く使われているライブラリがMatplotlibです。そして、Matplotlibの中でも最も基本的で頻繁に使用される関数が、線グラフや散布図を描画するための matplotlib.pyplot.plot() です。

この記事では、pyplot.plot() 関数について、初心者でも理解できるように、その基本的な使い方から高度なテクニック、様々なカスタマイズ方法までを徹底的に解説します。約5000語のボリュームで、この関数に関するほとんどの疑問が解消されることを目指します。

1. なぜMatplotlibとpyplotなのか?

Matplotlibは、Pythonで静的、インタラクティブ、アニメーション化された視覚化を作成するための包括的なライブラリです。様々な種類のグラフ(線グラフ、散布図、棒グラフ、ヒストグラム、等高線図など)を作成する機能を提供します。

Matplotlibには、いくつかのインターフェースがありますが、最も一般的に使われるのが pyplot モジュールです。これはMATLABに似たコマンドスタイルの関数セットを提供し、グラフの作成を簡単に行えるように設計されています。通常、import matplotlib.pyplot as plt としてインポートし、plt というエイリアスを通じて関数を呼び出します。

pyplot は「ステートベース」なインターフェースです。つまり、現在のFigure(グラフ全体のウィンドウ)やAxes(個々のプロット領域)の状態を追跡し、呼び出された関数はその現在の状態に作用します。これにより、簡単なグラフを素早く作成できます。より複雑なグラフやカスタマイズには、Matplotlibのオブジェクト指向インターフェースを使用することも多いですが、plot 関数自体は両方のインターフェースで使用可能です。この記事では主に pyplot インターフェースを中心に説明しつつ、オブジェクト指向インターフェースでの使い方にも触れます。

2. pyplot.plot() の基本

pyplot.plot() 関数は、座標のリストや配列を受け取り、それらを線で結んだり、マーカーとして点を打ったりすることでグラフを描画します。最も基本的な使い方は、Y座標のデータのリストやNumPy配列を一つだけ渡す方法です。

“`python
import matplotlib.pyplot as plt
import numpy as np

例1: Y座標のみを指定

y_data = [1, 5, 3, 6, 2, 8]
plt.plot(y_data)
plt.ylabel(‘Y値’)
plt.title(‘Y座標のみ指定した場合のプロット’)
plt.show()
“`

この場合、plot 関数は渡されたリストの値をY座標として使用し、対応するX座標としてはリストのインデックス(0, 1, 2, …)を使用します。結果として、X軸が0から始まり、Y軸が指定した値となる線グラフが描画されます。

次に、X座標とY座標の両方を指定する方法です。これは最も一般的な使い方です。

“`python

例2: X座標とY座標を指定

x_data = [1, 2, 3, 4, 5, 6]
y_data = [1, 5, 3, 6, 2, 8]
plt.plot(x_data, y_data)
plt.xlabel(‘X値’)
plt.ylabel(‘Y値’)
plt.title(‘X座標とY座標を指定した場合のプロット’)
plt.show()
“`

この場合、plt.plot()(x_data[i], y_data[i]) の組を順番にプロットし、それらを線で結びます。X座標とY座標のデータは、同じ長さである必要があります。NumPy配列を使用すると、データの生成や操作が容易になります。

“`python

例3: NumPy配列を使用

x_np = np.linspace(0, 10, 100) # 0から10までを100等分した配列
y_np = np.sin(x_np) # それに対応するsinの値
plt.plot(x_np, y_np)
plt.xlabel(‘X (radians)’)
plt.ylabel(‘sin(X)’)
plt.title(‘NumPy配列とsin関数’)
plt.show()
“`

NumPy配列を使用すると、より滑らかな曲線を描画するために多くのデータポイントを簡単に生成できます。

3. 線スタイル、色、マーカーのカスタマイズ

plot 関数は、描画する線のスタイル、色、およびデータポイントを示すマーカーを非常に柔軟にカスタマイズできます。これらのカスタマイズは、関数に引数として渡すことで行います。主な引数には以下があります。

  • color (c): 線の色
  • linestyle (ls): 線のスタイル (実線、破線など)
  • linewidth (lw): 線の太さ
  • marker: データポイントを示すマーカーのスタイル
  • markersize (ms): マーカーのサイズ
  • markerfacecolor (mfc): マーカーの内部の色
  • markeredgecolor (mec): マーカーの境界線の色

3.1. 色 (color または c)

色の指定には、様々な方法があります。

  • 省略記号: ‘b’ (青), ‘g’ (緑), ‘r’ (赤), ‘c’ (シアン), ‘m’ (マゼンタ), ‘y’ (黄色), ‘k’ (黒), ‘w’ (白)
  • HTML/CSS カラー名: ‘red’, ‘blue’, ‘green’, ‘orange’, ‘purple’ など
  • 16進数RGBコード: ‘#FF0000’ (赤), ‘#0000FF’ (青) など
  • 0-1のfloat値によるRGBタプル: (1.0, 0.0, 0.0) (赤)
  • グレースケール: ‘0.8’ (明るいグレー) など

“`python

色のカスタマイズ例

x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, color=’green’, label=’sin(x)’) # HTMLカラー名
plt.plot(x, y2, c=’#FF8C00′, label=’cos(x)’) # 16進数RGBコード

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘色のカスタマイズ’)
plt.legend()
plt.show()
“`

3.2. 線スタイル (linestyle または ls)

線スタイルには、以下の一般的なオプションがあります。

  • ‘-‘: 実線 (デフォルト)
  • ‘–‘: 破線
  • ‘-.’: 一点鎖線
  • ‘:’: 点線
  • ‘None’ または ”: 線なし

“`python

線スタイルのカスタマイズ例

x = np.linspace(0, 10, 20)
y1 = x2
y2 = x
2 + 5

plt.plot(x, y1, linestyle=’–‘, label=’破線’)
plt.plot(x, y2, ls=’:’, label=’点線’) # ‘ls’ は ‘linestyle’ の省略形

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘線スタイルのカスタマイズ’)
plt.legend()
plt.show()
“`

3.3. 線の太さ (linewidth または lw)

線の太さは、float値で指定します。デフォルトは通常1.0です。

“`python

線の太さのカスタマイズ例

x = np.linspace(0, 10, 20)
y = np.sin(x)

plt.plot(x, y, linewidth=3.0, label=’太い線’) # 3.0ポイントの太さ

plt.xlabel(‘X’)
plt.ylabel(‘sin(X)’)
plt.title(‘線の太さのカスタマイズ’)
plt.legend()
plt.show()
“`

3.4. マーカー (marker)

マーカーは、データポイント自体を視覚的に示すための記号です。線と組み合わせて使うことも、線なしでマーカーだけをプロットして散布図のように使うこともできます。一般的なマーカーの種類をいくつか紹介します。

  • ‘.’: ポイント
  • ‘o’: 円
  • ‘v’: 下向き三角
  • ‘^’: 上向き三角
  • ‘s’: 四角
  • ‘*’: 星
  • ‘x’: X
  • ‘+’: プラス
  • ‘D’: ひし形
  • ‘|’: 垂直線
  • ‘_’: 水平線
  • None: マーカーなし (デフォルトで線がある場合)

完全なリストはMatplotlibの公式ドキュメントを参照してください。

“`python

マーカーのカスタマイズ例

x = [1, 2, 3, 4, 5]
y = [2, 5, 1, 6, 3]

plt.plot(x, y, marker=’o’, label=’円マーカー’)
plt.plot(x, [yi + 1 for yi in y], marker=’^’, linestyle=’–‘, label=’三角マーカーと破線’)
plt.plot(x, [yi + 2 for yi in y], marker=’*’, linestyle=’None’, label=’星マーカーのみ’) # 線なしでマーカーのみ

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘マーカーのカスタマイズ’)
plt.legend()
plt.show()
“`

3.5. マーカーのサイズ (markersize または ms)、色 (markerfacecolor または mfc, markeredgecolor または mec)

マーカーのサイズ、内部の色、境界線の色もカスタマイズできます。

“`python

マーカーのサイズと色のカスタマイズ例

x = [1, 2, 3, 4, 5]
y = [2, 5, 1, 6, 3]

plt.plot(x, y, marker=’o’, markersize=10, mfc=’red’, mec=’blue’, label=’大きい赤円(青枠)’)
plt.plot(x, [yi + 1 for yi in y], marker=’s’, ms=12, mfc=’yellow’, mec=’green’, lw=2, ls=’–‘, label=’大きい黄四角(緑枠、破線)’) # 線スタイル、太さ、マーカーを組み合わせる

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘マーカーのサイズと色のカスタマイズ’)
plt.legend()
plt.show()
“`

3.6. 短縮フォーマット文字列

plot 関数は、色、マーカー、線スタイルをまとめて指定するための短縮フォーマット文字列を受け取ります。これはMATLABから引き継がれた便利な機能ですが、全てのオプション(線の太さ、マーカーサイズなど)を指定できるわけではないため、詳細なカスタマイズには個別のキーワード引数を使用する必要があります。

フォーマット文字列の形式は [marker][linestyle][color] または [linestyle][marker][color] です。順序は柔軟ですが、色、マーカー、線のスタイルをそれぞれ一つずつしか指定できません。

よく使われる例:
* ‘b-‘ : 青の実線
* ‘ro’ : 赤い円マーカー (線なし)
* ‘g–‘ : 緑の破線
* ‘ks:’ : 黒い四角マーカーと点線

“`python

短縮フォーマット文字列の例

x = np.linspace(0, 10, 20)
y1 = x
y2 = x + 2
y3 = x + 4

plt.plot(x, y1, ‘r-o’, label=’赤 実線 円マーカー’) # r:red, -:solid, o:circle
plt.plot(x, y2, ‘bs–‘, label=’青 破線 四角マーカー’) # b:blue, s:square, –:dashed
plt.plot(x, y3, ‘g:‘, label=’緑 点線 星マーカー’) # g:green, ::dotted, :star

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘短縮フォーマット文字列’)
plt.legend()
plt.show()
“`

短縮フォーマット文字列は簡潔ですが、線の太さやマーカーサイズなどは別途キーワード引数で指定する必要があります。例えば、太い赤い破線と大きな円マーカーを描画したい場合は以下のようになります。

python
plt.plot(x, y, 'r--', linewidth=2, marker='o', markersize=8)

この柔軟性が plot 関数の強力な点です。

4. 複数の線を同時にプロットする

一つのAxes(プロット領域)に複数の線を同時に描画するには、いくつかの方法があります。

4.1. plot 関数を複数回呼び出す

最も簡単な方法は、描画したい線ごとに plt.plot() 関数を呼び出すことです。pyplot は、自動的に異なる線に対して異なる色やスタイルを割り当ててくれる(サイクル)ので、手動でスタイルを指定する必要はありません。ただし、特定のスタイルが必要な場合は、上記の引数を使って明示的に指定します。

“`python

複数回 plot を呼び出す例

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) + np.cos(x)

plt.plot(x, y1, label=’sin(x)’)
plt.plot(x, y2, label=’cos(x)’)
plt.plot(x, y3, label=’sin(x) + cos(x)’, linestyle=’–‘) # 3本目はスタイルを明示的に指定

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘複数行のプロット (複数呼び出し)’)
plt.legend()
plt.show()
“`

plt.legend() を呼び出すことで、各線の label 引数で指定した文字列を含む凡例が表示されます。

4.2. 一回の plot 呼び出しで複数の線を指定する

plot 関数は、X, Y, [スタイル], X, Y, [スタイル], … のように、複数のペアのX, Yデータ(とオプションのスタイル文字列)を引数として受け取ることができます。

“`python

1回の plot 呼び出しで複数行を指定する例

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, ‘r-‘, x, y2, ‘g–‘) # 1回の呼び出しで2本プロット

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘複数行のプロット (1回呼び出し)’)

この方法では legend の label を直接指定できないので、別途 Lines を取得して設定するか、

オブジェクト指向インターフェースを使用する方が一般的です。

ここでは簡単のため legend は省略します。

plt.show()
“`

この方法は簡潔ですが、各線に個別のキーワード引数(linewidth, markersizeなど)を適用するのが難しくなります。また、各線に label をつけて凡例を自動生成するのも手間がかかります(戻り値のLine2Dオブジェクトを操作する必要がある)。そのため、一般的には複数回 plt.plot() を呼び出すか、オブジェクト指向インターフェースを使用する方が柔軟性が高いです。

5. 軸ラベル、タイトル、凡例の追加

グラフを理解しやすくするためには、軸ラベル、タイトル、凡例は必須です。

  • plt.xlabel(label_string): X軸のラベルを設定します。
  • plt.ylabel(label_string): Y軸のラベルを設定します。
  • plt.title(title_string): Axes(プロット領域)のタイトルを設定します。
  • plt.suptitle(title_string): Figure(ウィンドウ全体)のタイトルを設定します(複数のサブプロットがある場合などに便利)。
  • plt.legend(): plot 関数で label 引数を使用して指定した各線の凡例を表示します。loc 引数で凡例の位置を指定できます (‘upper right’, ‘lower left’, ‘best’ など)。

“`python

ラベル、タイトル、凡例の例

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label=’正弦波’)
plt.plot(x, y2, label=’余弦波’, linestyle=’–‘)

plt.xlabel(‘時間 [s]’)
plt.ylabel(‘振幅’)
plt.title(‘正弦波と余弦波の時間変化’)
plt.suptitle(‘Matplotlib plot関数デモ’) # Figure全体のタイトル
plt.legend(loc=’upper right’) # 凡例を右上に配置

plt.show()
“`

日本語を使用する場合は、Matplotlibがデフォルトで日本語フォントを扱えないことがあるため、別途フォント設定が必要になる場合があります(この記事の範囲からは外れますが、matplotlib.rc などで設定します)。

6. 軸の範囲と目盛りの制御

デフォルトでは、Matplotlibはデータの範囲に基づいて自動的に軸の範囲と目盛りを設定します。しかし、表示したい範囲を限定したり、特定の場所に目盛りを打ちたい場合があります。

  • plt.xlim(xmin, xmax): X軸の表示範囲を設定します。
  • plt.ylim(ymin, ymax): Y軸の表示範囲を設定します。
  • plt.xticks(ticks, [labels]): X軸の目盛りの位置とラベルを設定します。
  • plt.yticks(ticks, [labels]): Y軸の目盛りの位置とラベルを設定します。

“`python

軸の範囲と目盛りの制御例

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)

plt.xlabel(‘X’)
plt.ylabel(‘sin(X)’)
plt.title(‘軸の制御’)

X軸の範囲を[0, 5]に限定

plt.xlim(0, 5)

Y軸の範囲を[-1.2, 1.2]に設定

plt.ylim(-1.2, 1.2)

X軸の目盛りを0, 1, 2, …, 5に設定

plt.xticks(np.arange(6))

Y軸の目盛りを-1, 0, 1に設定

plt.yticks([-1, 0, 1])

plt.show()
“`

xticksyticks は、目盛りを表示したい位置のリストや配列を最初の引数に取ります。オプションで、その位置に表示したいラベルのリストを2番目の引数に渡すことができます。ラベルを指定しない場合は、位置の値がそのままラベルとして表示されます。

7. グリッドの追加

グラフにグリッド(格子線)を追加すると、データの値を読み取りやすくなる場合があります。

  • plt.grid(True): グリッドを表示します。
  • plt.grid(False): グリッドを非表示にします。
  • plt.grid() には、線の色、スタイル、太さなどをカスタマイズするための引数もあります (color, linestyle, linewidth, alpha など)。また、axis 引数で ‘x’, ‘y’, ‘both’ のいずれかを指定して、X軸方向またはY軸方向のみにグリッドを表示することも可能です。

“`python

グリッドの追加例

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)

plt.xlabel(‘X’)
plt.ylabel(‘sin(X)’)
plt.title(‘グリッドの追加’)

グリッドを表示

plt.grid(True)

Y軸方向のみに薄い赤の点線グリッドを表示

plt.grid(axis=’y’, color=’red’, linestyle=’:’, alpha=0.6)

plt.show()
“`

8. グラフの保存

作成したグラフをファイルとして保存するには、plt.savefig() 関数を使用します。

  • plt.savefig(filename): 指定したファイル名でグラフを保存します。拡張子 (.png, .jpg, .pdf, .svg, .eps など) によってファイル形式が自動的に判別されます。
  • dpi 引数: 解像度をドット/インチで指定します。高解像度で保存したい場合に便利です(例: dpi=300)。
  • bbox_inches='tight': 余白を最小限にして保存します。凡例などがグラフ領域外に出てしまうのを防ぐのに役立ちます。

“`python

グラフの保存例

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.xlabel(‘X’)
plt.ylabel(‘sin(X)’)
plt.title(‘保存されるグラフ’)

PNG形式で保存 (高解像度、タイトな余白)

plt.savefig(‘sin_wave_plot.png’, dpi=300, bbox_inches=’tight’)

PDF形式で保存

plt.savefig(‘sin_wave_plot.pdf’)

print(“グラフを ‘sin_wave_plot.png’ および ‘sin_wave_plot.pdf’ として保存しました。”)

保存後は必要に応じて plt.show() で表示するか、表示しない場合は plt.close() でメモリを解放します

plt.show()

plt.close() # 保存後にウィンドウを閉じたい場合

“`

plt.show() は、グラフを表示するだけでなく、イベントループを開始し、その時点までに作成されたすべてのFigureを描画します。plt.savefig()plt.show() を呼び出す前に実行する必要があります。そうでなければ、plt.show() が新しい空のFigureを作成して表示してしまう可能性があります。

9. オブジェクト指向インターフェースでの plot

これまで matplotlib.pyplot のステートベースなインターフェース (plt.plot(), plt.xlabel() など) を中心に説明してきました。これは簡単なグラフ作成には便利ですが、複数のグラフを一つのウィンドウに配置したり、各Axesの要素を細かく制御したりする場合には、Matplotlibのオブジェクト指向インターフェースを使用するのが一般的です。

オブジェクト指向インターフェースでは、Figure (グラフ全体のコンテナ) と Axes (個々のプロット領域) のオブジェクトを明示的に作成し、そのオブジェクトのメソッドを呼び出してグラフを操作します。

  • fig = plt.figure(): 新しいFigureオブジェクトを作成します。
  • ax = fig.add_subplot(nrows, ncols, index): FigureにAxesオブジェクトを追加します。nrows行、ncols列のグリッドのindex番目(1から開始)にAxesを配置します。
  • fig, ax = plt.subplots(nrows, ncols): 新しいFigureと、nrows行、ncols列のグリッドで配置されたAxesオブジェクトの配列を一度に作成する便利な関数です。単一のAxesの場合は fig, ax = plt.subplots() とします。
  • ax.plot(...): Axesオブジェクトの plot メソッドを呼び出して、そのAxesに線をプロットします。
  • ax.set_xlabel(...), ax.set_ylabel(...), ax.set_title(...): Axesオブジェクトのメソッドでラベルやタイトルを設定します。
  • ax.set_xlim(...), ax.set_ylim(...): Axesオブジェクトのメソッドで軸の範囲を設定します。
  • ax.grid(...), ax.legend(...) など、ほとんどの pyplot 関数に対応するAxesメソッドがあります。

オブジェクト指向インターフェースでの plot の使い方は、pyplot.plot とほぼ同じですが、呼び出し元が plt ではなくAxesオブジェクト (ax) になる点が異なります。

“`python

オブジェクト指向インターフェースでの plot 例

import matplotlib.pyplot as plt
import numpy as np

1つのAxesを持つFigureを作成

fig, ax = plt.subplots(figsize=(8, 6)) # figsizeでFigureのサイズも指定できる

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

axオブジェクトの plot メソッドを呼び出す

ax.plot(x, y1, label=’sin(x)’, color=’blue’)
ax.plot(x, y2, label=’cos(x)’, linestyle=’–‘, color=’red’)

axオブジェクトのメソッドでカスタマイズ

ax.set_xlabel(‘X value’)
ax.set_ylabel(‘Y value’)
ax.set_title(‘Object-Oriented Plotting’)
ax.legend()
ax.grid(True)

plt.show()
“`

複数のサブプロットを作成する場合、このオブジェクト指向のアプローチが非常に効果的です。

“`python

複数のサブプロットでの plot 例 (オブジェクト指向)

import matplotlib.pyplot as plt
import numpy as np

2×1のサブプロットを持つFigureを作成

fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(8, 8)) # axes は Axesオブジェクトの配列

x = np.linspace(0, 10, 100)

1番目のサブプロット (axes[0]) にプロット

axes[0].plot(x, np.sin(x), color=’blue’)
axes[0].set_title(‘Sine Wave’)
axes[0].set_ylabel(‘Amplitude’)
axes[0].grid(True)

2番目のサブプロット (axes[1]) にプロット

axes[1].plot(x, np.cos(x), color=’red’, linestyle=’–‘)
axes[1].set_title(‘Cosine Wave’)
axes[1].set_xlabel(‘Time [s]’)
axes[1].set_ylabel(‘Amplitude’)
axes[1].grid(True)

plt.tight_layout() # サブプロット間の間隔を調整
plt.show()
“`

オブジェクト指向インターフェースは、より複雑なグラフを構築する際に推奨される方法です。plot 関数自体の使い方は変わりませんが、どのAxesに描画するかを明示的に指定できる点が異なります。

10. その他のplot関数の便利な引数

plot 関数には、上記で説明した以外にも多くの便利な引数があります。いくつか例を挙げます。

  • alpha: 線の透明度 (0.0から1.0の間)。複数の線が重なる場合に便利です。
  • drawstyle (ds): ポイント間の線の引き方 (‘default’, ‘steps’, ‘steps-pre’, ‘steps-mid’, ‘steps-post’ など)。段階的な変化を示すデータに有効です。
  • label: 凡例に使用する文字列。
  • data: プロットするデータを含むpandas DataFrameなどを指定し、X, Y引数で列名を指定できるようになります。

“`python

その他の引数の例

x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
y_noisy = y + np.random.randn(50) * 0.2

plt.plot(x, y, label=’Original’, color=’blue’, linewidth=2)
plt.plot(x, y_noisy, label=’Noisy’, color=’red’, alpha=0.5, marker=’o’, linestyle=’None’) # 透明度とマーカーのみ

段階的なデータのプロット

steps_x = [1, 2, 3, 4, 5]
steps_y = [10, 5, 15, 10, 20]
plt.plot(steps_x, steps_y, drawstyle=’steps-post’, label=’Steps (post)’, color=’green’) # 階段状プロット

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘plot 関数のその他の引数’)
plt.legend()
plt.grid(True)
plt.show()
“`

10.1. データをpandas DataFrameから直接プロットする

plot 関数は、data 引数を使用してpandas DataFrameを指定し、X, Yには列名を文字列で渡すこともできます。これにより、DataFrameからのプロットが直感的に行えます。

“`python

pandas DataFrame からのプロット例

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

ダミーDataFrameを作成

data = {
‘時間’: np.arange(10),
‘温度’: [22, 24, 25, 23, 26, 27, 25, 24, 23, 22],
‘湿度’: [60, 58, 55, 59, 50, 48, 53, 55, 58, 61]
}
df = pd.DataFrame(data)

data引数を使用

plt.plot(‘時間’, ‘温度’, data=df, marker=’o’, label=’温度’)
plt.plot(‘時間’, ‘湿度’, data=df, marker=’s’, linestyle=’–‘, label=’湿度’)

plt.xlabel(‘時間’)
plt.ylabel(‘値’)
plt.title(‘DataFrameからのプロット’)
plt.legend()
plt.grid(True)
plt.show()
“`

この方法は、DataFrameをよく使うデータ分析のワークフローにおいて非常に便利です。

11. plot を使った特殊なグラフ

plot 関数は主に線グラフや散布図に使用されますが、工夫次第で他の種類のグラフ表現にも利用できます。

11.1. 水平線・垂直線

特定の閾値や平均値を示すための水平線や垂直線は、axhlineaxvline 関数を使用するのが最も適切ですが、plot 関数でも代替できます。

“`python

水平線・垂直線の描画例 (plot 関数を使用)

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y, label=’sin(x)’)

平均値を示す水平線

average_y = np.mean(y)
plt.plot([x[0], x[-1]], [average_y, average_y], color=’red’, linestyle=’–‘, label=f’平均 ({average_y:.2f})’)

特定のX値での垂直線 (例: x=pi の位置)

pi_approx = np.pi
plt.plot([pi_approx, pi_approx], [plt.ylim()[0], plt.ylim()[1]], color=’green’, linestyle=’:’, label=f’x={pi_approx:.2f}’) # Y軸の範囲いっぱいに線を引く

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘plot による水平線/垂直線’)
plt.legend()
plt.grid(True)
plt.show()
``
より推奨されるのは
plt.axhline(average_y, color=’red’, linestyle=’–‘, label=f’平均 ({average_y:.2f})’)plt.axvline(pi_approx, color=’green’, linestyle=’:’, label=f’x={pi_approx:.2f}’)` を使う方法です。これらの方が用途が明確で、軸の自動調整なども適切に行われるためです。

11.2. 塗りつぶし (fill_between)

二つの線や、線と軸の間を塗りつぶすことで、範囲や領域を表現できます。これは plot 関数自体ではなく、関連する fill_between 関数を使用します。

“`python

fill_between の例

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.sin(x) * 0.5 + 0.5 # y1より上にある別の波形

plt.plot(x, y1, label=’Sine 1′, color=’blue’)
plt.plot(x, y2, label=’Sine 2′, color=’red’, linestyle=’–‘)

2つの線の間を塗りつぶす

plt.fill_between(x, y1, y2, where=(y1 > y2), color=’cyan’, alpha=0.3, label=’Sine 1 > Sine 2′) # y1 > y2 の範囲をシアンで塗りつぶし
plt.fill_between(x, y1, y2, where=(y1 <= y2), color=’magenta’, alpha=0.3, label=’Sine 1 <= Sine 2′) # y1 <= y2 の範囲をマゼンタで塗りつぶし

または、線とX軸の間を塗りつぶす場合

plt.fill_between(x, y1, color=’cyan’, alpha=0.2) # y1 と X軸 (y=0) の間を塗りつぶし

plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.title(‘fill_between による塗りつぶし’)
plt.legend()
plt.grid(True)
plt.show()
“`

fill_betweenplot と密接に関連しており、線グラフの文脈でよく使われるためここで触れました。

12. パフォーマンスに関する考慮事項

非常に多くのデータポイント (x, y 配列が数百万要素など) をプロットする場合、パフォーマンスが問題になることがあります。Matplotlibは大量のデータを扱うのに非常に効率的ですが、限界はあります。

  • データの間引き: 必要以上に詳細なプロットが不要な場合は、データポイントを間引いて数を減らすことで描画速度を向上させることができます。
  • アンチエイリアシング: 線のギザギザを滑らかにするアンチエイリアシングは計算コストがかかります。plot 関数の antialiased=False や、保存時の savefigrasterized=True 引数で無効化することで、速度を上げられる場合があります(特にPDFやSVGなどのベクター形式で大量のデータをプロットする場合)。
  • バックエンド: Matplotlibには様々なバックエンド(レンダリングを行う部分)があります。使用している環境や目的(画面表示かファイル出力か)に応じて最適なバックエンドを選択することで、パフォーマンスが向上する場合があります。

ほとんどの一般的な用途ではパフォーマンスは問題になりませんが、大規模なデータセットを扱う場合はこれらの点に注意すると良いでしょう。

13. plot と他のプロットタイプの使い分け

Matplotlibには plot 以外にも様々なプロット関数があります。それぞれの用途を理解しておくことは重要です。

  • plot: 主に連続的なデータの線グラフ、またはマーカーのみを使用した基本的な散布図に使用されます。XとYの関係を線で追いたい場合に最適です。
  • scatter: 散布図に特化しています。plot でマーカーのみを使用するよりも、scatter は各点のサイズや色を個別に指定できるなど、より詳細なカスタマイズが可能です。データポイント間の関係性や分布を見るのに適しています。
  • bar / barh: 棒グラフを描画します。カテゴリ別のデータの比較に用いられます。
  • hist: ヒストグラムを描画します。データの分布を見るのに用いられます。
  • imshow / matshow: 画像や行列データを色のマップとして表示します。
  • contour / contourf: 等高線図を描画します。3次元データを2次元平面に表現するのに用いられます。

これらの関数はそれぞれ異なる種類のデータの可視化に適しています。線でデータポイントを結ぶ必要がある、あるいはX軸が時間の経過や順序を表す連続的なデータである場合は、多くの場合 plot が適切な選択肢となります。

14. よくある落とし穴とトラブルシューティング

  • plt.show() を忘れる: スクリプトの最後に plt.show() を呼び出さないと、グラフウィンドウが表示されません(ただし、Jupyter Notebookや一部のインタラクティブ環境では不要な場合もあります)。
  • データ長が一致しない: plot(x, y) のようにXとYを指定する場合、xy の要素数は同じである必要があります。そうでなければエラーが発生します。
  • NumPy配列の使用: データの計算や操作はNumPy配列で行うのが効率的かつ一般的です。Pythonのリストも使えますが、特に大規模なデータではNumPyの使用を強く推奨します。
  • ステートベースとオブジェクト指向の混在: plt.plot()ax.set_xlabel() のように、pyplot の関数呼び出しとAxesオブジェクトのメソッド呼び出しを不適切に混在させると、意図しない結果になることがあります。一つのグラフ内ではどちらか一方のスタイルに統一するのが良いでしょう(特に複雑なグラフではオブジェクト指向推奨)。
  • 凡例が表示されない: plt.legend() を呼び出す前に、plt.plot()(または ax.plot())の呼び出しで label='...' を指定しているか確認してください。
  • 日本語が表示されない: 前述の通り、日本語フォントの設定が必要です。
  • グラフが重なって見にくい: plt.tight_layout()fig.tight_layout()plt.show() の前に呼び出すと、サブプロットなどが適切に配置されることが多いです。

15. まとめと次のステップ

この記事では、Matplotlibの pyplot.plot() 関数について、その基本的な使い方から、色、線スタイル、マーカー、太さなどの詳細なカスタマイズ方法、複数の線のプロット、軸ラベル、タイトル、凡例の追加、軸の範囲と目盛りの制御、グラフの保存、そしてオブジェクト指向インターフェースでの使い方までを網羅的に解説しました。

plot 関数は、Matplotlibにおける最も基本的なグラフ作成ツールでありながら、その引数を使いこなすことで非常に多様な表現が可能です。単に線を描くだけでなく、データのパターン、傾向、ポイントを強調するために、線のスタイル、マーカー、色、太さを適切に選択することが、効果的なデータ可視化の鍵となります。

次に学ぶべきステップとしては、以下のようなものがあります。

  • scatter 関数を使ったより高度な散布図の作成。
  • bar, hist, boxplot などの他のプロットタイプの使い方。
  • 複数のサブプロットを柔軟に配置・制御する方法 (オブジェクト指向インターフェースの詳細)。
  • 軸の目盛りのフォーマッタ (日付表示など) やアノテーションの追加。
  • スタイルシートを使ったグラフの外観の一括変更。
  • インタラクティブなグラフやアニメーションの作成。

Matplotlibのドキュメントは非常に充実しており、これらのトピックについてさらに深く学ぶための素晴らしいリソースです。

pyplot.plot() はデータ可視化の旅の始まりです。この記事で解説した内容を基に、あなたのデータから洞察を引き出すための美しいグラフを作成してみてください。


以上で、matplotlib.pyplot.plot() 関数に関する約5000語の詳細な解説記事となります。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール