Problems about multiprocessing

Hello, everyone. I want separate the data updating process with the plotting process. I found a code 1 and modified it. However, an error happened. Could anyone tell me how to correct it?

import threading
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.lines as line
import numpy as np
from matplotlib.image import NonUniformImage
from matplotlib import cm
interp = 'nearest'
# Linear x array for cell centers:
x = np.linspace(-4, 4, 9)
# Highly nonlinear x array:
x2 = x**3
y = np.linspace(-4, 4, 9)
z = np.sqrt(x[np.newaxis, :]**2 + y[:, np.newaxis]**2)

fig = plt.figure()
ax = plt.subplot(111)
im = NonUniformImage(ax, interpolation=interp,
                     cmap=cm.Purples)

def plot_init():
    ax.add_image(im)
    return [im]

def plot_update(i):
    global z
    data_copy = z.copy()
    im.set_data(x,y,data_copy)
    ax.set_title("title",fontsize=8)
    plt.suptitle('Suptitle',fontsize=8)
    return [im]

ani = animation.FuncAnimation(fig,plot_update,init_func=plot_init,
                              frames=1,
                              interval=30)
def dataUpdate_thead():
    global z
    while True:
        z=np.random.rand(*z.shape)

ad_rdy_ev = threading.Event()
ad_rdy_ev.set()
t = threading.Thread(target=dataUpdate_thead, args=())
t.daemon = True
t.start()

plt.show()

The error message is as follows:

Traceback (most recent call last):
File "E:\Anaconda3\lib\site-packages\matplotlib\backends\backend_qt5.py", line 480, in _draw_idle self.draw()
File "E:\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py", line 407, in draw self.figure.draw(self.renderer)
File "E:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper return draw(artist, renderer, *args, **kwargs)
File "E:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 1863, in draw mimage._draw_list_compositing_images(
File "E:\Anaconda3\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images a.draw(renderer)
File "E:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper return draw(artist, renderer, *args, **kwargs)
File "E:\Anaconda3\lib\site-packages\matplotlib\cbook\deprecation.py", line 411, in wrapper return func(*inner_args, **inner_kwargs)
File "E:\Anaconda3\lib\site-packages\matplotlib\axes_base.py", line 2747, in draw mimage._draw_list_compositing_images(renderer, self, artists)
File "E:\Anaconda3\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images a.draw(renderer)
File "E:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper return draw(artist, renderer, *args, **kwargs)
File "E:\Anaconda3\lib\site-packages\matplotlib\image.py", line 626, in draw if self.get_array().size == 0:
AttributeError: 'NoneType' object has no attribute 'size'

Regardless of threads, your init_func does not set any data on the NonUniformImage, so it crashes when drawing the first frame.

You need to set some initial data (even if empty) on it.

Thanks a lot for your reply! The problem is solved.