はじめに
この実験では、Python の Matplotlib ライブラリを使ってマンデルブロ集合の陰影付きで電力正規化されたレンダリングを生成する方法を学びます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
まず、使用するライブラリをインポートする必要があります。NumPy、Matplotlib、および Colors です。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
マンデルブロ集合関数を定義する
次に、マンデルブロ集合を生成する関数を定義します。この関数にはいくつかのパラメータが必要です。
xmin,xmax,ymin,ymax:x 軸と y 軸の最小値と最大値xnとyn:各軸に沿って生成する点の数maxiter:各点に対して実行する最大反復回数horizon:集合の一部と見なす点の最大値
def mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon=2.0):
X = np.linspace(xmin, xmax, xn).astype(np.float32)
Y = np.linspace(ymin, ymax, yn).astype(np.float32)
C = X + Y[:, None] * 1j
N = np.zeros_like(C, dtype=int)
Z = np.zeros_like(C)
for n in range(maxiter):
I = abs(Z) < horizon
N[I] = n
Z[I] = Z[I]**2 + C[I]
N[N == maxiter-1] = 0
return Z, N
マンデルブロ集合を生成する
次に、必要なパラメータを使って mandelbrot_set 関数を呼び出して、マンデルブロ集合を生成します。これにより、2 つの配列が得られます。
Z:反復処理した複素数の最終値N:各点が集合の一部と判定されるまでに実行した反復回数
xmin, xmax, xn = -2.25, +0.75, 3000 // 2
ymin, ymax, yn = -1.25, +1.25, 2500 // 2
maxiter = 200
horizon = 2.0 ** 40
log_horizon = np.log2(np.log(horizon))
Z, N = mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon)
データを正規化する
マンデルブロ集合の陰影付きで電力正規化されたレンダリングを作成するために、データを正規化する必要があります。これは、以下の式を使って行います。
M = N + 1 - np.log2(np.log(abs(Z))) + log_horizon
with np.errstate(invalid='ignore'):
M = np.nan_to_num(N + 1 - np.log2(np.log(abs(Z))) + log_horizon)
プロットを作成する
正規化されたデータができたので、プロットを作成できます。データを画像として表示するために imshow 関数を使い、何を見ているかを示すためにプロットにいくつかのテキストも追加します。
dpi = 72
width = 10
height = 10*yn/xn
fig = plt.figure(figsize=(width, height), dpi=dpi)
ax = fig.add_axes([0, 0, 1, 1], frameon=False, aspect=1)
light = colors.LightSource(azdeg=315, altdeg=10)
M = light.shade(M, cmap=plt.cm.hot, vert_exag=1.5,
norm=colors.PowerNorm(0.3), blend_mode='hsv')
ax.imshow(M, extent=[xmin, xmax, ymin, ymax], interpolation="bicubic")
ax.set_xticks([])
ax.set_yticks([])
year = time.strftime("%Y")
text = ("The Mandelbrot fractal set\n"
"Rendered with matplotlib %s, %s - https://matplotlib.org"
% (matplotlib.__version__, year))
ax.text(xmin+.025, ymin+.025, text, color="white", fontsize=12, alpha=0.5)
plt.show()
まとめ
この実験では、Python の Matplotlib ライブラリを使って、マンデルブロ集合の陰影付きで電力正規化されたレンダリングを生成する方法を学びました。これは、集合を生成する関数を定義し、データを正規化し、正規化されたデータを使ってプロットを作成することで達成されました。この技術は、視覚的に魅力的で情報に富んだ画像を作成するために、他のデータセットに適用できます。