Python Matplotlib 를 이용한 만델브로 집합 시각화

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Python 의 Matplotlib 라이브러리를 사용하여 만델브로 집합 (Mandelbrot set) 의 음영 처리되고 전력 정규화된 렌더링을 생성하는 과정을 안내합니다.

VM 팁

VM 시작이 완료되면, 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 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 축의 최소 및 최대 값
  • xnyn: 각 축을 따라 생성할 점의 수
  • 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 함수를 호출하여 만델브로 집합을 생성합니다. 이렇게 하면 두 개의 배열이 생성됩니다.

  • 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 라이브러리를 사용하여 만델브로 집합의 음영 처리 및 거듭제곱 정규화 렌더링을 생성하는 방법을 배웠습니다. 집합을 생성하는 함수를 정의하고, 데이터를 정규화하고, 정규화된 데이터를 사용하여 플롯을 생성함으로써 이를 달성했습니다. 이 기술은 시각적으로 매력적이고 유익한 이미지를 만들기 위해 다른 데이터 세트에도 적용할 수 있습니다.