【注】
最初にpyplotの関数利用を体験し、次にオブジェクト指向型の使い方を説明する。それぞれ異なった関数名があるので混乱しやすいが、このような複数のスタイルがあることを認識していれば慣れやすいと思う。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 100) # [-pi, pi]を100等分した値を配列(リスト)に
y = np.sin(x + 1.0) # yもxと同じ要素数のリスト (numpyの数学関数はリストを引数にすることができる)
plt.plot(x, y) # xとyともリスト
plt.show()
y1 = np.cos(x + 1.5)
plt.plot(x,y)
plt.plot(x,y1)
plt.xlabel("x") # 単純な軸ラベル
plt.ylabel("$\\sin (x+1.0)$, $\\cos (x+1.5)$") # 数式をLaTeX文法で入れる
plt.title("Title")
plt.legend(["$\\sin (x+1.0)$", "$\\cos (x+1.5)$"]) # 凡例はリストあるいはタプル(定数のリスト)で与える
plt.show()
2価関数的なplotも可能 → 軌跡描画などに使用
plt.plot(y,x)
plt.show()
こちらのほうが自由度が多いので推奨する。(Web上の参考事例では両者が混ざっていることもあるのでわかりにくい。)
(注)
下の例のようにadd_subplotで追加する方法以外に
fig, axs = plt.subplots((2,2), figsize=(5,5))
と、複数のsubplotを作ってしまうこともできる。この場合、axsは2行2列のaxisの配列になる。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(9,5)) # オプションは省略可、ほかにもオプションはある
x = np.linspace(-np.pi, np.pi, 100) # [-pi, pi]を100等分した値を配列(リスト)に
y = np.sin(x + 1.0) # yもxと同じ要素数のリスト
y1 = np.cos(x + 1.5)
ax1 = fig.add_subplot(1,2,1) # 1行2列の1番目
ax1.plot(x, y)
ax1.set_xlabel("$x$") # plotオブジェクトに対していろいろなメソッドがある。
ax2 = fig.add_subplot(1,2,2)
ax2.plot(x,y1)
ax2.plot(x, x**2)
ax2.set_title("Plot2")
ax2.legend(("plo1", "plot2"))
# plt.savefig("test.pdf") # ファイルに書き出す
<matplotlib.legend.Legend at 0x7f0c181497f0>
pandasのDataFrameの複数のデータのプロットを一つの図に入れ込むときは、上記のようにaxisを作っておいて、DataFrameのplotのオプションにaxにプロットオブジェクトを指定する。
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact
def my_plot(amp=1.0, omega=1.0, phase=0.0): # 振幅、各振動数、位相シフトを引数とするsinプロット
domain=[-np.pi, np.pi]
x = np.linspace(domain[0], domain[1], 100)
y = amp * np.sin(omega * x + phase)
plt.plot(x, y)
plt.show()
interact(my_plot, amp=(0.1, 4.0, 0.1), omega=(0.1, 4.0, 0.1), phase=(-np.pi, np.pi, 0.1))
# widgetの種類を特定せず(最小,最大, 初期値)のみを与えた場合は、スライダになる。
<function __main__.my_plot(amp=1.0, omega=1.0, phase=0.0)>
Plotting starts after pushing "Run Interact".
from ipywidgets import interact_manual
interact_manual(my_plot, amp=(0.1, 4.0, 0.1), omega=(0.1, 4.0, 0.1), phase=(-np.pi, np.pi, 0.1))
<function __main__.my_plot(amp=1.0, omega=1.0, phase=0.0)>