Python анимация затенения matplotlib
Поэтому я пытаюсь создать анимацию из нескольких гауссовых графиков, которые движутся со временем. У меня базовая анимация работает так, как я и предполагал. Но тогда я хотел затенить область под кривыми Гаусса. Я использовал функцию ax.fill, чтобы затенить ее. Но вместо этого он просто затеняет чертежный вектор, который создает кривые, и он просто становится беспорядком. Любые предложения или помощь будут высоко ценится
import numpy as np
import matplotlib.pyplot as plt
plt.switch_backend('agg')
import matplotlib.animation as animation
import pylab as p
Gamma=0.0005
q=1.6e-19
m=0.067*9e-31
B=10
Ec=(1.0567e-34)*B/m
#e=2.78
#E0=0+(1.0567e-34)*x*i/m
fig, ax = plt.subplots()
n = 3 #number of lines
x = np.arange(0, 3.6e-3, 1.7e-5) # x-array, third number is interval here, x is energy
lines = [ax.plot(x, np.e**(-(x-((1.0567e-34)*1*1/m))**2/Gamma**2))[0]for _ in range(n)]
def animate(i):
for d, line in enumerate(lines):
p=(d+1)/2.
line.set_ydata(np.e**((-(x-((1.0567e-34)*p*i/m))**2)/Gamma**2))
ax.fill(x,(np.e**(-(x-((1.0567e-34)*p*i/m))**2/Gamma**2)), "b")# update the data
return lines
#Init only required for blitting to give a clean slate.
def init():
for line in lines:
line.set_ydata(np.ma.array(x, mask=True))
return lines
ani = animation.FuncAnimation(fig, animate, np.arange(0, 2.5, .01), init_func=init,
interval=10, blit=True)
Writer = animation.writers['ffmpeg']
writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)
ani.save('QHanimati.mp4', writer=writer)
plt.show()
Таким образом, текущий код запускает анимацию, которая дает что-то вроде этого. кривая
И я хочу, чтобы он оставил область над кривой белым цветом.
Благодарю.
1 ответ
Вы должны знать, что сохраненная анимация - это анимация, которая будет показана, если blit=False
, Так что получается, что все заливки складываются в холст.
Решение состоит в том, чтобы удалить предыдущий, прежде чем добавлять следующий (как-то вроде set_data
не существует напрямую для заливок).
Опять же, мы бы создали список заливок и фактически использовали fill_between
, вместо fill
который мы можем использовать для удаления заливок и добавления новых.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
Gamma=0.0005
q=1.6e-19
m=0.067*9e-31
B=10
Ec=(1.0567e-34)*B/m
fig, ax = plt.subplots()
n = 3 #number of lines
x = np.arange(0, 3.6e-3, 1.7e-5) # x-array, third number is interval here, x is energy
lines = [ax.plot(x, np.e**(-(x-((1.0567e-34)*1*1/m))**2/Gamma**2), zorder=i+3)[0] for i in range(n)]
fills = [ax.fill_between(x,0,(np.e**(-(x-((1.0567e-34)*1*1/m))**2/Gamma**2)), facecolor=lines[i].get_color(), zorder=i+3) for i in range(n)]
def animate(i):
for d, line in enumerate(lines):
p=(d+1)/2.
line.set_ydata(np.e**((-(x-((1.0567e-34)*p*i/m))**2)/Gamma**2))
fills[d].remove()
fills[d] = ax.fill_between(x,0,(np.e**(-(x-((1.0567e-34)*p*i/m))**2/Gamma**2)), facecolor=lines[d].get_color(), zorder=d+3)# update the data
return lines + fills
#Init only required for blitting to give a clean slate.
def init():
for line in lines:
line.set_ydata(np.ma.array(x, mask=True))
return lines
ani = animation.FuncAnimation(fig, animate, np.arange(0, 2.5, .01), init_func=init,
interval=10, blit=True)
#Writer = animation.writers['ffmpeg']
#writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)
#
#ani.save('QHanimati.mp4', writer=writer)
plt.show()