Приведенный ниже код работает, но я думаю, что исходные точки пересчитываются в каждом цикле повторения. Я хочу, чтобы он начинался с начала, каждый повторяющийся цикл с четким сюжетом. Среди многих подходов к исправлению этого я пытался вставить ax.clear() как в функции инициализации, так и в функции обновления; не эффективны. Я оставил в коде то, что, как я думал, сбросит ln, artist к пустому набору; опять же, это не то решение, которое я ищу. Я был бы признателен за некоторые рекомендации о том, как правильно повторно инициировать каждый цикл в этом игрушечном примере, чтобы при применении к моей более сложной проблеме я не подвергался кумулятивным штрафам. Это отлично работает с точки зрения обновления при передаче массива... Спасибо за любую помощь.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, writers
#from basic_units import radians
# # Set up formatting for the movie files
# Writer = writers['ffmpeg']
# writer = Writer(fps=20, metadata=dict(artist='Llew'), bitrate=1800)
#Polar stuff
fig = plt.figure(figsize=(10,8))
ax = plt.subplot(111,polar=True)
ax.set_title("A line plot on a polar axis", va='bottom')
ax.set_rticks([0.5, 1, 1.5, 2]) # fewer radial ticks
ax.set_facecolor(plt.cm.gray(.95))
ax.grid(True)
xT=plt.xticks()[0]
xL=['0',r'$\frac{\pi}{4}$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',\
r'$\pi$',r'$\frac{5\pi}{4}$',r'$\frac{3\pi}{2}$',r'$\frac{7\pi}{4}$']
plt.xticks(xT, xL)
r = []
theta = []
# Animation requirements.
ln, = plt.plot([], [], 'r:',
markersize=1.5,
alpha=1,
animated=True)
def init():
ax.set_xlim(0, 2)
ax.set_ylim(0, 2)
return ln,
def update(frame):
r.append(frame)
theta.append(5*np.pi*frame)
ln.set_data(theta, r)
return ln,
ani = FuncAnimation(fig, update, frames=np.linspace(0,2,400),
init_func=init, interval=10, blit=True,repeat=True)
plt.show()
Я попытался сбросить списки (и с массивами также), используя этот несколько грубый подход, который стер список, но не повторно инициировал цикл.
def update(frame,r,theta):
r.append(frame)
theta.append(5*np.pi*frame)
if len(r)>=400:
r = [0]
theta=[0]
ln.set_data(theta, r)
return ln,
Напротив, это работает так, как задумано...
for i in range(25):
r.append(i)
print('len(r)',len(r), r)
if len(r) >=10:
r = []
print('if r>=10:',r)
print('Post conditional clause r',len(r),r)
Это побудило меня попробовать следующее, отметив, что передача внутреннего (r, theta) внутри update() снаружи требует объявления его как глобальной переменной. С помощью следующего кода график теперь сбрасывает каждый цикл вместо перерисовки. Я чувствую, что это довольно долгий путь вокруг простой процедуры - любые улучшения принимаются с благодарностью.
#This solution also works
def update(frame):
r.append(frame)
theta.append(5*np.pi*frame)
if len(r)>=400:
global r
r = []
global theta
theta=[]
ln.set_data(theta, r)
return ln,