はじめに
このチュートリアルでは、Python の Matplotlib ライブラリを使って、3D プロットの折れ線グラフの下の領域を埋めるポリゴンを作成する方法を学びます。ポリゴンは半透明になり、一種の「ギザギザのステンドグラス」の効果を作り出します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
必要なライブラリをインポートして始めましょう。
import math
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import PolyCollection
グラフの下のポリゴンを定義する関数
次に、polygon_under_graph(x, y) という関数を定義します。この関数は、(x, y) の折れ線グラフの下の領域を埋めるポリゴンを定義する頂点リストを構築します。この関数は、x が昇順であることを前提としています。
def polygon_under_graph(x, y):
"""
Construct the vertex list which defines the polygon filling the space under
the (x, y) line graph. This assumes x is in ascending order.
"""
return [(x[0], 0.), *zip(x, y), (x[-1], 0.)]
3D プロットを作成する
ここでは、Matplotlib を使って 3D プロットを作成します。
ax = plt.figure().add_subplot(projection='3d')
x と lambda の配列を定義する
それぞれ linspace 関数と range 関数を使って、x と lambda の配列を定義します。
x = np.linspace(0., 10., 31)
lambdas = range(1, 9)
頂点と面の色を計算する
Matplotlib のvectorize関数とcolormaps関数を使って、頂点と面の色を計算します。
## verts[i] は、ポリゴン i を定義する (x, y) のペアのリストです。
gamma = np.vectorize(math.gamma)
verts = [polygon_under_graph(x, l**x * np.exp(-l) / gamma(x + 1))
for l in lambdas]
facecolors = plt.colormaps['viridis_r'](np.linspace(0, 1, len(verts)))
ポリゴンを作成してプロットに追加する
Matplotlib のPolyCollection関数を使ってポリゴンを作成し、それらをプロットに追加します。
poly = PolyCollection(verts, facecolors=facecolors, alpha=.7)
ax.add_collection3d(poly, zs=lambdas, zdir='y')
プロットの範囲とラベルを設定する
最後に、set関数を使ってプロットの範囲とラベルを設定します。
ax.set(xlim=(0, 10), ylim=(1, 9), zlim=(0, 0.35),
xlabel='x', ylabel=r'$\lambda$', zlabel='probability')
プロットを表示する
show関数を使ってプロットを表示します。
plt.show()
まとめ
このチュートリアルでは、Python の Matplotlib ライブラリを使って、3D プロットの折れ線グラフの下の領域を埋めるポリゴンを作成する方法を学びました。ポリゴンを作成するためにPolyCollection関数を使い、set関数を使ってプロットの範囲とラベルを設定しました。