Visualização do Conjunto de Mandelbrot com Python Matplotlib

Beginner

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

Introdução

Este laboratório irá guiá-lo através da geração de uma renderização sombreada e normalizada por potência do conjunto de Mandelbrot usando a biblioteca Matplotlib do Python.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar as Bibliotecas Necessárias

Primeiramente, precisamos importar as bibliotecas que usaremos: NumPy, Matplotlib e Colors.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

Definir a Função do Conjunto de Mandelbrot

Em seguida, definiremos uma função que gera o conjunto de Mandelbrot. A função recebe vários parâmetros:

  • xmin, xmax, ymin, ymax: os valores mínimo e máximo para os eixos x e y
  • xn e yn: o número de pontos a serem gerados ao longo de cada eixo
  • maxiter: o número máximo de iterações a serem realizadas para cada ponto
  • horizon: o valor máximo no qual considerar um ponto como parte do conjunto
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

Gerar o Conjunto de Mandelbrot

Agora, geraremos o conjunto de Mandelbrot chamando a função mandelbrot_set com nossos parâmetros desejados. Isso nos dará dois arrays:

  • Z: os valores finais dos números complexos sobre os quais iteramos
  • N: o número de iterações realizadas para cada ponto antes de ser determinado como parte do conjunto
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)

Normalizar os Dados

Para criar uma renderização sombreada e com normalização de potência do conjunto de Mandelbrot, precisamos normalizar nossos dados. Faremos isso usando a seguinte fórmula:

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)

Criar o Gráfico

Agora que temos nossos dados normalizados, podemos criar o gráfico. Usaremos a função imshow para exibir os dados como uma imagem, e também adicionaremos algum texto ao gráfico para indicar o que estamos observando.

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()

Resumo

Neste laboratório, aprendemos como gerar uma renderização sombreada e com normalização de potência do conjunto de Mandelbrot usando a biblioteca Matplotlib do Python. Conseguimos isso definindo uma função para gerar o conjunto, normalizando os dados e criando um gráfico usando os dados normalizados. Essa técnica pode ser aplicada a outros conjuntos de dados para criar imagens visualmente atraentes e informativas.