Animation was deleted without rendering anything. This is most likely unintended?

Viewed 2060

I'm wondering, what is wrong with this code that tries to reproduce a animated version of Mandelbrot fractals. I think the structure-wise, it should be ok, since I can get a static plot without the animation part, but when I try to run it with animation to perform iterations, it give me error.

Upon execution of the code, I got UserWarning: Animation was deleted without rendering anything. This is most likely unintended. To prevent deletion, assign the Animation to a variable that exists for as long as you need the Animation. but apparently a variable is assigned to it...

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation


def mandelbrot(x, y, threshold):
    """Calculates whether the number c = x + i*y belongs to the 
    Mandelbrot set. In order to belong, the sequence z[i + 1] = z[i]**2 + c
    must not diverge after 'threshold' number of steps. The sequence diverges
    if the absolute value of z[i+1] is greater than 4.
    """

    c = complex(x, y)
    z = complex(0, 0)
    
    for i in range(threshold):
        z = z**2 + c
        if abs(z) > 4.:  # it diverged
            return i
        
    return threshold - 1  # it didn't diverge



x_start, y_start = -2, -1.5 
width, height = 3, 3  
density_per_unit = 250  

# real and imaginary axis
re = np.linspace(x_start, x_start + width, width * density_per_unit )
im = np.linspace(y_start, y_start + height, height * density_per_unit)


def animate(i):
    ax.clear()   
    ax.set_xticks([], [])    
    ax.set_yticks([], [])    

    X = np.empty((len(re), len(im)))    
    threshold = round(1.15**(i + 1))   

    # iterations for the current threshold
    for i in range(len(re)):
        for j in range(len(im)):
            X[i, j] = mandelbrot(re[i], im[j], threshold)

    # associate colors to the iterations with an iterpolation
    img = ax.imshow(X.T, interpolation="bicubic", cmap='magma')
    return [img]

fig = plt.figure(figsize=(10, 10)) 
ax = plt.axes()
   
anim = FuncAnimation(fig, animate, frames=45, interval=100, repeat=True)
0 Answers
Related