Visualización del Conjunto de Mandelbrot con Matplotlib de Python

Beginner

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

Introducción

Esta práctica te guiará a través de la generación de una representación iluminada y normalizada en potencia del conjunto de Mandelbrot utilizando la librería Matplotlib de Python.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haz clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

En ocasiones, es posible que tengas que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tienes problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona retroalimentación después de la sesión y resolveremos rápidamente el problema para ti.

Importar las bibliotecas necesarias

En primer lugar, necesitamos importar las bibliotecas que utilizaremos: NumPy, Matplotlib y Colors.

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

Definir la función del conjunto de Mandelbrot

A continuación, definiremos una función que genera el conjunto de Mandelbrot. La función toma varios parámetros:

  • xmin, xmax, ymin, ymax: los valores mínimo y máximo para los ejes x e y
  • xn e yn: el número de puntos a generar a lo largo de cada eje
  • maxiter: el número máximo de iteraciones a realizar para cada punto
  • horizon: el valor máximo en el que se considera que un punto es parte del 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

Generar el conjunto de Mandelbrot

Ahora generaremos el conjunto de Mandelbrot llamando a la función mandelbrot_set con los parámetros deseados. Esto nos dará dos matrices:

  • Z: los valores finales de los números complejos sobre los que iteramos
  • N: el número de iteraciones realizadas para cada punto antes de determinar que era parte del 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 los datos

Para crear una representación iluminada y normalizada en potencia del conjunto de Mandelbrot, necesitamos normalizar nuestros datos. Lo haremos utilizando la siguiente 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)

Crear la gráfica

Ahora que tenemos nuestros datos normalizados, podemos crear la gráfica. Utilizaremos la función imshow para mostrar los datos como una imagen, y también agregaremos algo de texto a la gráfica para indicar de qué se trata.

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 = ("El conjunto fractal de Mandelbrot\n"
        "Renderizado con 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()

Resumen

En este laboratorio, aprendimos cómo generar una representación iluminada y normalizada en potencia del conjunto de Mandelbrot utilizando la biblioteca Matplotlib de Python. Lo logramos definiendo una función para generar el conjunto, normalizando los datos y creando una gráfica utilizando los datos normalizados. Esta técnica se puede aplicar a otros conjuntos de datos para crear imágenes visualmente atractivas e informativas.