matplotlib.pyplot.plot で2曲線の描画範囲を個別に設定して plot と塗りつぶし

In [1]:
# NumPy も使います
import numpy as np
# Matplotlib でグラフを描きます
import matplotlib.pyplot as plt

# 以下はグラフを SVG で Notebook にインライン表示させる設定
%config InlineBackend.figure_formats = ['svg']

同一の描画範囲で2本の曲線を plt.plot()

plt.plot() で2つの関数の曲線を同時にグラフにする例。

以下の例では $y=\cos x$ と $y=\sin x$ を 同一の描画範囲 $0 \leq x \leq 2\pi$ で plt.plot() します。書式は…

plt.plot(x1, y1, x1, y2, ...)
In [2]:
x = np.linspace(0, 2*np.pi, 100)
plt.plot(x, np.cos(x), x, np.sin(x));

2本の曲線の描画範囲を個別に設定して plt.plot()

2つの曲線の描画範囲をそれぞれ別に,また曲線の描画範囲とグラフの表示範囲を独立に設定することもできます。

以下の例では,

  • $0 \leq x \leq \frac{\pi}{4}$ の範囲で $y=\cos x$
  • $0 \leq x \leq \pi$ の範囲で $y=\sin x$

plt.plot() します。個別の描画範囲,凡例,線色の設定と,グラフの表示範囲の設定の例。

In [3]:
x1 = np.linspace(0, np.pi/4, 100)
x2 = np.linspace(0, np.pi, 100)

plt.plot(x1, np.cos(x1), label = "cos $x$", color = "red")
plt.plot(x2, np.sin(x2), label = "sin $x$", color = "blue")
plt.legend();

陽関数で表された2曲線の間を塗りつぶす

$0 \leq x \leq \frac{\pi}{4}$ の範囲で $y=\cos x$ と $y=\sin x$ に囲まれた領域を塗りつぶしてみます。

In [4]:
x1 = np.linspace(0, np.pi/4, 100)
x2 = np.linspace(0, np.pi, 100)

plt.plot(x1, np.cos(x1), label = "cos $x$", color = "red")
plt.plot(x2, np.sin(x2), label = "sin $x$", color = "blue")
# 塗りつぶし
plt.fill_between(x1, np.cos(x1), np.sin(x1), fc="yellow")
plt.legend();

横軸の目盛位置と目盛ラベルの設定

今度は,以下のページにある例:
$\displaystyle \frac{\pi}{4} \leq x \leq \frac{5\pi}{4}$ の範囲で $y=\sin x$ と $y=\cos x$ で囲まれた部分を塗りつぶします。

横軸の目盛を $\frac{\pi}{4}$ ごとにつける設定をしてみます。

「理工系の数学B」の積分の練習問題で,「図の塗りつぶした部分の面積を求めよ。」なんていうときに使います。

In [5]:
x = np.linspace(0, 2*np.pi, 100)
x1 = np.linspace(np.pi/4, 5*np.pi/4, 100)

plt.plot(x, np.cos(x), label = "cos $x$", color = "red")
plt.plot(x, np.sin(x), label = "sin $x$", color = "blue")
# 塗りつぶし
plt.fill_between(x1, np.cos(x1), np.sin(x1), fc="yellow")
plt.legend()

# x 軸の目盛の位置とラベルの設定
plt.xticks(
  ticks = [(np.pi/4 * i) for i in range(9)], 
  labels = [('%4.2f' % (i/4))+" $\pi$" for i in range(9)])
# y 軸の目盛の位置
plt.yticks([(0.5*i) for i in range(-2,3)])

# グリッドの表示
plt.grid();

縦線を引く

2曲線の交点である $x = \frac{\pi}{4}$ と $x = \frac{5\pi}{4}$ のところに vlines() で縦線を引いてみます。

In [6]:
x = np.linspace(0, 2*np.pi, 100)
x1 = np.linspace(np.pi/4, 5*np.pi/4, 100)

plt.plot(x, np.cos(x), label = "cos $x$", color = "red")
plt.plot(x, np.sin(x), label = "sin $x$", color = "blue")
plt.fill_between(x1, np.cos(x1), np.sin(x1), fc="yellow")
plt.legend()
plt.xticks(
  ticks = [(np.pi/4 * i) for i in range(9)], 
  labels = [('%4.2f' % (i/4))+" $\pi$" for i in range(9)])
plt.yticks([(0.5*i) for i in range(-2,3)])
plt.grid()

# 表示範囲
plt.xlim(0, 2*np.pi)
plt.ylim(-1.1, 1.1)

# 2本の縦線を引く
plt.vlines(x=np.pi/4, ymin = -1.1, ymax=np.sin(np.pi/4), color = 'black')
plt.vlines(x=5*np.pi/4, ymin = -1.1, ymax=np.sin(5*np.pi/4), color = 'black');

異なる範囲での塗りつぶしの例

もう一つの例。$y=f(x)$ と $x$ 軸の間を,$0.5 \leq x \leq 2$ までは黄色で,$2 \leq x \leq 2.5$ までは灰色で塗りつぶしてみます。

In [7]:
def f(x):
    return 0.6*x + 0.4*np.cos(x)

x = np.linspace(0.2, 2.8, 100)
x1 = np.linspace(0.5, 2, 100)
x2 = np.linspace(2, 2.5, 100)

plt.plot(x, f(x), color = "blue")
# 0.5 <= x <= 2 を黄色で塗りつぶし
plt.fill_between(x1, f(x1), fc="yellow")
# 2 <= x <= 2.5 を灰色で塗りつぶし
plt.fill_between(x2, f(x2), fc="lightgray")

plt.xlim(0.3, 3)
plt.ylim(0, 1.5);

ついでに,外枠と縦軸目盛を非表示にし,塗りつぶした領域などに数式フォントで図中にテキストラベルを書いてみる。

In [8]:
# 外枠と縦軸目盛を非表示に
fig, ax = plt.subplots()
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.axes.yaxis.set_visible(False)

def f(x):
    return 0.6*x + 0.4*np.cos(x)

x = np.linspace(0.2, 2.8, 100)
x1 = np.linspace(0.5, 2, 100)
x2 = np.linspace(2, 2.5, 100)

plt.plot(x, f(x), color = "blue")
plt.fill_between(x1, f(x1), fc="yellow")
plt.fill_between(x2, f(x2), fc="lightgray")

# x 軸の目盛とラベルの設定
plt.xticks(
    ticks = [0.5, 2, 2.5], 
    labels = ["$0$", "$x$", "$x+\Delta x$"], 
    math_fontfamily='cm', size=16)

# 図中にテキスト
plt.text(2.85, 1.28, "$f(x)$", math_fontfamily='cm', size=16)
plt.text(1.1, 0.4, "$S(x)$", math_fontfamily='cm', size=24)
plt.text(2.05, 0.4, "$\Delta S$", math_fontfamily='cm', size=24)

plt.xlim(0.3, 3)
plt.ylim(0, 1.5);

グラフを pdf ファイルに保存

最近の弘大 JupyterHub では,日本語を含んでいても,特に問題なく pdf ファイルとして保存できるようだ。書式は…

plt.plot(x, y,...);
plt.savefig("filename.pdf");
In [9]:
plt.plot(x, f(x), color = "blue", 
         label="関数 $f(x)$")
plt.fill_between(x1, f(x1), fc="yellow")
plt.fill_between(x2, f(x2), fc="lightgray")
plt.title("グラフ")
plt.text(0.9, 0.4, "ここの面積", size=18)
plt.legend();

plt.savefig("pmnuri.pdf");