Pynote

Python、機械学習、画像処理について

matplotlib - fill_between, fill_betweenx, fill で塗りつぶした図形を作成する。

公式リファレンス

fill_between

2つの関数の y 軸方向の区間を塗りつぶす。

import matplotlib.pyplot as plt
import numpy as np

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

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.plot(x, y1)
ax.plot(x, y2)
ax.fill_between(x, y1, y2)

plt.show()


マスクで塗りつぶす範囲を限定する。

import matplotlib.pyplot as plt
import numpy as np

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

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.plot(x, y1)
ax.plot(x, y2)
ax.fill_between(x, y1, y2, where=x < 5)

plt.show()


ポリゴンの設定

色など設定したい場合は matplotlib.collections.PolyCollection のパラメータで指定できる。

import matplotlib.pyplot as plt
import numpy as np

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

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.plot(x, y1)
ax.plot(x, y2)
ax.fill_between(x, y1, y2, facecolor="w", hatch="//")

plt.show()



2つの折れ線の点の間隔が異なる場合

2つの折れ線の点の間隔が異なる場合は fill_between の代わりに fill を使い、以下のようにする。

import matplotlib.pyplot as plt
import numpy as np

x1 = np.linspace(0, 10, 1000)
y1 = np.sin(x1)

x2 = np.linspace(0, 10, 100)
y2 = np.cos(x2)
print(x1.shape, x2.shape)

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.plot(x1, y1, label="sin")
ax.plot(x2, y2, label="cos")
ax.fill(np.append(x1, x2[::-1]), np.append(y1, y2[::-1]))

plt.show()

fill_betweenx

2つの関数の x 軸方向の区間を塗りつぶす。

import matplotlib.pyplot as plt
import numpy as np

y = np.linspace(0, 4 * np.pi, 100)
x1 = np.sin(y)
x2 = np.cos(y)

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.plot(x1, y)
ax.plot(x2, y)
ax.fill_betweenx(y, x1, x2)

plt.show()


マスクで塗りつぶす範囲を限定する。

import matplotlib.pyplot as plt
import numpy as np

y = np.linspace(0, 4 * np.pi, 100)
x1 = np.sin(y)
x2 = np.cos(y)

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.plot(x1, y)
ax.plot(x2, y)
ax.fill_betweenx(y, x1, x2, where=y < 5)

plt.show()


ポリゴンの設定

色など設定したい場合は matplotlib.collections.PolyCollection のパラメータで指定できる。

import matplotlib.pyplot as plt
import numpy as np

y = np.linspace(0, 4 * np.pi, 100)
x1 = np.sin(y)
x2 = np.cos(y)

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.plot(x1, y)
ax.plot(x2, y)
ax.fill_betweenx(y, x1, x2, facecolor="w", hatch="//")

plt.show()


fill

ax.fill(x, y)
ax.fill(x, y, color)
ax.fill(x, y, x2, y2)
ax.fill(x, y, color1, x2, y2, color2)

1つのポリゴンを描画する。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([0, 1, 2, 1])
y = np.array([1, 2, 1, 0])

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.fill(x, y)

plt.show()


複数のポリゴンを一度に描画する。

import matplotlib.pyplot as plt
import numpy as np

x1 = np.array([0, 1, 2, 1])
x2 = x1 + 1
y = np.array([1, 2, 1, 0])

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.fill(x1, y, x2, y)

plt.show()


色を指定する。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([0, 1, 2, 1])
y = np.array([1, 2, 1, 0])

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.fill(x, y, color="orange")

plt.show()


import matplotlib.pyplot as plt
import numpy as np

x1 = np.array([0, 1, 2, 1])
x2 = x1 + 1
y = np.array([1, 2, 1, 0])

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.fill(x1, y, "orange", x2, y, "red")

plt.show()


ポリゴンの設定

色など設定したい場合は matplotlib.patches.Polygon のパラメータで指定できる。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([0, 1, 2, 1])
y = np.array([1, 2, 1, 0])

fig, ax = plt.subplots(figsize=(5, 5), facecolor="w")
ax.fill(x, y, edgecolor="k", facecolor="w", hatch="o")

plt.show()