Visualisation du Mandelbrot avec Python Matplotlib

Beginner

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

Introduction

Ce laboratoire vous guidera dans la génération d'une représentation ombrée et normalisée en puissance de l'ensemble de Mandelbrot à l'aide de la bibliothèque Matplotlib de Python.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Importation des bibliothèques requises

Tout d'abord, nous devons importer les bibliothèques que nous allons utiliser : NumPy, Matplotlib et Colors.

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

Définir la fonction de l'ensemble de Mandelbrot

Ensuite, nous allons définir une fonction qui génère l'ensemble de Mandelbrot. La fonction prend plusieurs paramètres :

  • xmin, xmax, ymin, ymax : les valeurs minimales et maximales pour les axes x et y
  • xn et yn : le nombre de points à générer le long de chaque axe
  • maxiter : le nombre maximum d'itérations à effectuer pour chaque point
  • horizon : la valeur maximale à laquelle considérer qu'un point fait partie de l'ensemble
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

Générer l'ensemble de Mandelbrot

Maintenant, nous allons générer l'ensemble de Mandelbrot en appelant la fonction mandelbrot_set avec les paramètres souhaités. Cela nous donnera deux tableaux :

  • Z : les valeurs finales des nombres complexes sur lesquels nous avons itéré
  • N : le nombre d'itérations effectuées pour chaque point avant qu'il ne soit déterminé comme faisant partie de l'ensemble
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)

Normaliser les données

Pour créer une représentation ombrée et normalisée en puissance de l'ensemble de Mandelbrot, nous devons normaliser nos données. Nous le ferons en utilisant la formule suivante :

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)

Créer le graphique

Maintenant que nous avons nos données normalisées, nous pouvons créer le graphique. Nous utiliserons la fonction imshow pour afficher les données sous forme d'image, et nous ajouterons également du texte au graphique pour indiquer ce que nous regardons.

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 = ("L'ensemble fractal de Mandelbrot\n"
        "Rendu avec 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()

Sommaire

Dans ce laboratoire, nous avons appris à générer une représentation ombrée et normalisée en puissance de l'ensemble de Mandelbrot à l'aide de la bibliothèque Matplotlib de Python. Nous avons accompli cela en définissant une fonction pour générer l'ensemble, en normalisant les données et en créant un graphique à l'aide des données normalisées. Cette technique peut être appliquée à d'autres ensembles de données pour créer des images visuellement attrayantes et informatives.