Matplotlib plot() 関数
plot()Matplotlib の中で最も中心となる関数で、折れ線グラフの描画に使用されます。
指定された x と y の座標点を結んで線を作成し、色、線種、マーカー、線幅のカスタマイズをサポートします。
関数定義
pyplot インターフェース
matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
Axes インターフェース
Axes.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
パラメータ説明
| パラメータ | 型 | 説明 |
|---|---|---|
| *args | 可変長引数 | 複数の呼び出し方をサポート:plot(y)、plot(x, y)、plot(x, y, 'fmt')、plot(x1, y1, 'fmt1', x2, y2, 'fmt2', ...) |
| scalex / scaley | bool | x/y 軸をデータに合わせて自動スケーリングするかどうか。デフォルトは True |
| data | インデックス可能なオブジェクト | 提供された場合、文字列を引数として使用し、その中のデータ列を参照できます。 |
| color または c | color | 線の色。例: 'red'、'#ff0000'、'tab:blue' |
| linestyle または ls | str | 線種:'-'(実線)、'--'(破線)、'-.'(一点鎖線)、':'(点線)、''(線なし) |
| linewidth または lw | float | 線の幅。デフォルトは約 1.5 |
| marker | str | データ点のマーカー:'.'、'o'、's'、'^'、'*'、'+'(プラス記号)、'x' など |
| markersize または ms | float | マーカーのサイズ |
| label | str | 凡例ラベル。legend() と一緒に使用します。 |
| alpha | float | 透明度。0(完全に透明)から 1(完全に不透明) |
| zorder | float | レイヤー順序。数値が大きいほど上に表示されます。 |
fmt 書式文字列は3つの部分から構成されます:
'[色][マーカー][線種]'、例えば'ro--'赤色、丸マーカー、破線を表します。各部分の順序は任意に並べられます。
よく使う色の略記
| 文字 | 色 | 文字 | 色 |
|---|---|---|---|
| 'b' | 青 blue | 'r' | 赤 red |
| 'g' | 緑 green | 'c' | シアン cyan |
| 'm' | マゼンタ magenta | 'y' | 黄 yellow |
| 'k' | 黒 black | 'w' | 白 white |
使用例
例1:最も簡単な折れ線グラフ
y 値のみを渡すと、x は自動的に 0 から始まるインデックスが使われます。
例
import matplotlib.pyplot as plt
import numpy as np
# 0〜10 の間の50個のデータポイントを生成
x = np.linspace(0, 10, 50)
y = np.sin(x) # 正弦関数
# 最も簡単な呼び出し:x, y
plt.plot(x, y)
plt.title('Simple Line Plot')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True, alpha=0.3)
plt.show()
import numpy as np
# 0〜10 の間の50個のデータポイントを生成
x = np.linspace(0, 10, 50)
y = np.sin(x) # 正弦関数
# 最も簡単な呼び出し:x, y
plt.plot(x, y)
plt.title('Simple Line Plot')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True, alpha=0.3)
plt.show()
例2:複数の曲線 + 書式文字列
同じグラフ上に複数の曲線を、異なる色、線種、マーカーを使って描画します。
例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-x / 3) # 減衰正弦
# 複数の曲線、それぞれ異なる書式
plt.plot(x, y1, 'b-o', label='sin(x)') # 青の実線 + 丸点
plt.plot(x, y2, 'r--s', label='cos(x)') # 赤の破線 + 四角
plt.plot(x, y3, 'g-.^', label='damped sin(x)') # 緑の一点鎖線 + 三角
plt.title('Multiple Lines with Different Styles')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
import numpy as np
x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-x / 3) # 減衰正弦
# 複数の曲線、それぞれ異なる書式
plt.plot(x, y1, 'b-o', label='sin(x)') # 青の実線 + 丸点
plt.plot(x, y2, 'r--s', label='cos(x)') # 赤の破線 + 四角
plt.plot(x, y3, 'g-.^', label='damped sin(x)') # 緑の一点鎖線 + 三角
plt.title('Multiple Lines with Different Styles')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
例3:キーワード引数を使用してスタイルをカスタマイズ
キーワード引数を使用して、線の外観をより細かく制御します。
例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')
# 書式文字列ではなくキーワード引数を使うと読みやすい
ax.plot(x, np.sin(x),
color='steelblue', # 色名
linestyle='-', # 実線
linewidth=2.5, # 線幅
marker='o', # 丸マーカー
markersize=4, # マーカーサイズ
markerfacecolor='red', # マーカーの塗りつぶし色
markeredgecolor='black', # マーカーの枠線の色
markeredgewidth=0.5, # マーカーの枠線の幅
alpha=0.8, # 全体の透明度
label='sin(x)')
# 比較:マーカーなしの破線
ax.plot(x, np.cos(x),
color='#ff6600', # 16進数の色
linestyle='--',
linewidth=2,
label='cos(x)')
ax.set_title('Customized Line Styles', fontsize=14)
ax.set_xlabel('x (radians)')
ax.set_ylabel('Amplitude')
ax.legend(loc='upper right')
ax.grid(True, alpha=0.2)
plt.show()
print("サンプル: customized plot displayed")
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')
# 書式文字列ではなくキーワード引数を使うと読みやすい
ax.plot(x, np.sin(x),
color='steelblue', # 色名
linestyle='-', # 実線
linewidth=2.5, # 線幅
marker='o', # 丸マーカー
markersize=4, # マーカーサイズ
markerfacecolor='red', # マーカーの塗りつぶし色
markeredgecolor='black', # マーカーの枠線の色
markeredgewidth=0.5, # マーカーの枠線の幅
alpha=0.8, # 全体の透明度
label='sin(x)')
# 比較:マーカーなしの破線
ax.plot(x, np.cos(x),
color='#ff6600', # 16進数の色
linestyle='--',
linewidth=2,
label='cos(x)')
ax.set_title('Customized Line Styles', fontsize=14)
ax.set_xlabel('x (radians)')
ax.set_ylabel('Amplitude')
ax.legend(loc='upper right')
ax.grid(True, alpha=0.2)
plt.show()
print("サンプル: customized plot displayed")
例4:data パラメータを使用(DataFrame 対応)
データが dict または pandas DataFrame の場合、文字列の列名を使用できます。
例
import matplotlib.pyplot as plt
import numpy as np
# データを辞書として整理する
data = {
'time': np.arange(0, 10, 0.5),
'voltage': np.sin(np.arange(0, 10, 0.5)) * 5 + 10,
'current': np.cos(np.arange(0, 10, 0.5)) * 2 + 5,
}
fig, ax = plt.subplots(layout='constrained')
# data パラメータ + 文字列の列名でデータを参照する
ax.plot('time', 'voltage', 'b-', data=data, label='Voltage (V)')
ax.plot('time', 'current', 'r--', data=data, label='Current (A)')
ax.set_title('Using data Parameter with Column Names')
ax.set_xlabel('Time (s)')
ax.set_ylabel('Value')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()
import numpy as np
# データを辞書として整理する
data = {
'time': np.arange(0, 10, 0.5),
'voltage': np.sin(np.arange(0, 10, 0.5)) * 5 + 10,
'current': np.cos(np.arange(0, 10, 0.5)) * 2 + 5,
}
fig, ax = plt.subplots(layout='constrained')
# data パラメータ + 文字列の列名でデータを参照する
ax.plot('time', 'voltage', 'b-', data=data, label='Voltage (V)')
ax.plot('time', 'current', 'r--', data=data, label='Current (A)')
ax.set_title('Using data Parameter with Column Names')
ax.set_xlabel('Time (s)')
ax.set_ylabel('Value')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()
例5:Axes オブジェクト上で呼び出す(推奨方法)
オブジェクト指向の Axes インターフェースを使用すると、複数サブプロットの場面でより明確になります。
例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
# 2つの横並びのサブプロットを作成
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4),
layout='constrained')
# 左のサブプロット:数学関数
ax1.plot(x, np.sin(x), label='sin(x)')
ax1.plot(x, np.cos(x), label='cos(x)')
ax1.set_title('Math Functions')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 右のサブプロット:データ傾向
data = np.random.randn(100).cumsum() # ランダムウォーク
ax2.plot(data, color='teal', linewidth=1.5)
ax2.set_title('Random Walk (cumulative sum)')
ax2.set_xlabel('Step')
ax2.set_ylabel('Position')
ax2.grid(True, alpha=0.3)
plt.show()
import numpy as np
x = np.linspace(0, 10, 100)
# 2つの横並びのサブプロットを作成
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4),
layout='constrained')
# 左のサブプロット:数学関数
ax1.plot(x, np.sin(x), label='sin(x)')
ax1.plot(x, np.cos(x), label='cos(x)')
ax1.set_title('Math Functions')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 右のサブプロット:データ傾向
data = np.random.randn(100).cumsum() # ランダムウォーク
ax2.plot(data, color='teal', linewidth=1.5)
ax2.set_title('Random Walk (cumulative sum)')
ax2.set_xlabel('Step')
ax2.set_ylabel('Position')
ax2.grid(True, alpha=0.3)
plt.show()
よくある質問
plot() における x と y の順序
標準の呼び出しはplot(x, y)、x が前、y が後です。
配列を1つだけ渡す場合、例えばplot(y)、x は自動的にインデックスを使用します。range(0, len(y))。
非連続の線分を描画するには?
NaN を含むデータの場合、plot() は NaN の位置で自動的に線分を分割し、これを使って区分線を描画できます。
fmt 文字列とキーワード引数は同時に使用できますか?
はい、キーワード引数は fmt 文字列内の対応する設定を上書きします。例えばplot(x, y, 'ro', color='blue')では、marker='o' は fmt に由来しますが、color は blue に上書きされます。
その他の拡張