Анимация с помощью процедуры pcolormesh в matplotlib, как мне инициализировать данные?

Я пытаюсь оживить pcolormesh в matplotlib. Я видел много примеров, используя анимацию пакетов, большинство из которых использует 1D-сюжетную программу, а некоторые из них – с imshow (). Во-первых, я решил использовать программу FuncAnimation. Моя проблема в том, что, во-первых, я не знаю, могу ли я инициализировать сюжет

fig,ax = plt.subplots() quad = ax.pcolormesh(X,Y,Z) 

Я пробовал несколько простых строк:

 fig,ax = plt.subplots() quad = ax.pcolormesh([]) def init(): quad.set_array([]) return quad, def animate(ktime): quad.set_array(X,Y,np.sin(Z)+ktime) return quad, anim = animation.FuncAnimation(fig,animate,init_func=init,frames=Ntime,interval=200,blit=True) 

plt.show ()

Кстати, как установить метки в анимированный сюжет? Могу ли я анимировать заголовок, если он показывает число, которое изменяется во времени? благодаря

Проблема заключалась в том, что я ошибочно использовал процедуру set_array() . Очень важно отметить, что вы должны передать 1D-массив этой подпрограмме. Чтобы сделать это, в отношении этого цвета, pcolormesh и т. Д. Обычно выстраивает многомерные массивы, вы должны использовать .ravel (). Еще одна важная вещь: для одновременного анимации разных сюжетов параметр blitz при animate.FuncAnimation должен быть False (см. Раздел «Анимация выбранных элементов сюжета» этой ссылки ).

Здесь я отправляю код этой простой программы с различными подзаголовками:

 import matplotlib.pyplot as plt import numpy as np import matplotlib.gridspec as gridspec import matplotlib.animation as animation y, x = np.meshgrid(np.linspace(-10, 10,100), np.linspace(-10, 10,100)) z = np.sin(x)*np.sin(x)+np.sin(y)*np.sin(y) v = np.linspace(-10, 10,100) t = np.sin(v)*np.sin(v) tt = np.cos(v)*np.cos(v) ########### fig = plt.figure(figsize=(16, 8),facecolor='white') gs = gridspec.GridSpec(5, 2) ax1 = plt.subplot(gs[0,0]) line, = ax1.plot([],[],'b-.',linewidth=2) ax1.set_xlim(-10,10) ax1.set_ylim(0,1) ax1.set_xlabel('time') ax1.set_ylabel('amplitude') ax1.set_title('Oscillationsssss') time_text = ax1.text(0.02, 0.95, '', transform=ax1.transAxes) ############################# ax2 = plt.subplot(gs[1:3,0]) quad1 = ax2.pcolormesh(x,y,z,shading='gouraud') ax2.set_xlabel('time') ax2.set_ylabel('amplitude') cb2 = fig.colorbar(quad1,ax=ax2) ######################### ax3 = plt.subplot(gs[3:,0]) quad2 = ax3.pcolormesh(x, y, z,shading='gouraud') ax3.set_xlabel('time') ax3.set_ylabel('amplitude') cb3 = fig.colorbar(quad2,ax=ax3) ############################ ax4 = plt.subplot(gs[:,1]) line2, = ax4.plot(v,tt,'b',linewidth=2) ax4.set_xlim(-10,10) ax4.set_ylim(0,1) def init(): line.set_data([],[]) line2.set_data([],[]) quad1.set_array([]) return line,line2,quad1 def animate(iter): t = np.sin(2*v-iter/(2*np.pi))*np.sin(2*v-iter/(2*np.pi)) tt = np.cos(2*v-iter/(2*np.pi))*np.cos(2*v-iter/(2*np.pi)) z = np.sin(x-iter/(2*np.pi))*np.sin(x-iter/(2*np.pi))+np.sin(y)*np.sin(y) line.set_data(v,t) quad1.set_array(z.ravel()) line2.set_data(v,tt) return line,line2,quad1 gs.tight_layout(fig) anim = animation.FuncAnimation(fig,animate,frames=100,interval=50,blit=False,repeat=False) plt.show() print 'Finished!!' 

Я не уверен, почему ваша функция quad = ax.pcolormesh (X, Y, Z) дает ошибку. Можете ли вы опубликовать сообщение об ошибке?

Ниже я сделаю так, чтобы создать простую анимацию с помощью pcolormesh:

 import matplotlib.pyplot as plt import numpy as np y, x = np.meshgrid(np.linspace(-3, 3,100), np.linspace(-3, 3,100)) z = np.sin(x**2+y**2) z = z[:-1, :-1] ax = plt.subplot(111) quad = plt.pcolormesh(x, y, z) plt.colorbar() plt.ion() plt.show() for phase in np.linspace(0,10*np.pi,200): z = np.sin(np.sqrt(x**2+y**2) + phase) z = z[:-1, :-1] quad.set_array(z.ravel()) plt.title('Phase: %.2f'%phase) plt.draw() plt.ioff() plt.show() 

Один из кадров: введите описание изображения здесь

Помогает ли это? Если нет, возможно, вы можете уточнить этот вопрос.

При использовании QuadMesh.set_array () необходимо угадать детали, которые необходимо соблюдать. Если вы намерены использовать QuadMesh с X, Y и C, вы можете обновить значения C с помощью set_array (). Но set_array не поддерживает тот же ввод, что и конструктор. Чтение источника показывает, что вам нужно передать 1d-массив, и что еще более озадачивает то, что в зависимости от настройки shading вам может понадобиться вырезать массив C

Изменить: есть даже очень старый отчет об ошибке, связанный с запутанным размером массива для shading='flat' .

Это значит:

Использование QuadMesh.set_array () с затенением = 'flat'

«flat» – значение по умолчанию для shading .

 # preperation import numpy as np import matplotlib.pyplot as plt plt.ion() y = np.linspace(-10, 10, num=1000) x = np.linspace(-10, 10, num=1000) X, Y = np.meshgrid(x, y) C = np.ones((1000, 1000)) * float('nan') # intantiate empty plot (values = nan) pcmesh = plt.pcolormesh(X, Y, C, vmin=-100, vmax=100, shading='flat') # generate some new data C = X * Y # necessary for shading='flat' C = C[:-1, :-1] # ravel() converts C to a 1d-array pcmesh.set_array(C.ravel()) # redraw to update plot with new data plt.draw() 

Выглядит как:

итоговая графика с shadig = flat

Обратите внимание: если вы опустите C = C[:-1, :-1] вы получите эту сломанную графику:

сломанная графика с затенением = плоская

Использование QuadMesh.set_array () с shading = 'gouraud'

 # preperation (same as for 'flat') import numpy as np import matplotlib.pyplot as plt plt.ion() y = np.linspace(-10, 10, num=1000) x = np.linspace(-10, 10, num=1000) X, Y = np.meshgrid(x, y) C = np.ones((1000, 1000)) * float('nan') # intantiate empty plot (values = nan) pcmesh = plt.pcolormesh(X, Y, C, vmin=-100, vmax=100, shading='gouraud') # generate some new data C = X * Y # here no cut of of last row/column! # ravel() converts C to a 1d-array pcmesh.set_array(C.ravel()) # redraw to update plot with new data plt.draw() 

Если вы отрезаете последнюю строку / столбец с помощью shade = 'gouraud', вы получите:

 ValueError: total size of new array must be unchanged 

Здесь представлен еще один ответ, который выглядит более простым (IMHO)

Вот копия и вставка альтернативного решения:

 import matplotlib.pylab as plt from matplotlib import animation fig = plt.figure() plt.hold(True) #We need to prime the pump, so to speak and create a quadmesh for plt to work with plt.pcolormesh(X[0:1], Y[0:1], C[0:1]) anim = animation.FuncAnimation(fig, animate, frames = range(2,155), blit = False) plt.show() plt.hold(False) def animate( self, i): plt.title('Ray: %.2f'%i) #This is where new data is inserted into the plot. plt.pcolormesh(X[i-2:i], Y[i-2:i], C[i-2:i]) 
Interesting Posts