Рисование анимации диаграммы Найквиста на питоне
В настоящее время я пытаюсь создать код Python, который должен рисовать анимированные диаграммы Найквиста и сохранить его в виде файла GIF.
Проблема в том, что я не знаю, как заставить работать функцию анимации. Вот код, который я нашел в Интернете, который работает:
def animate(i):
x = np.linspace(0, 2, 1000)
y = np.sin(2 * np.pi * (x - 0.01 * i))
line.set_data(x, y)
return line,
Как вы, возможно, знаете, linspace и sin - это функции, которые возвращают массивы с последовательными значениями. Переменные real и imag в моем коде также являются массивами с последовательными значениями. Переменная w также является массивом, соответствующим значениям real и imag. Я хотел, чтобы real и imag отображались для каждого значения w, таким образом, являясь "шагом" анимации. Что не так с моим кодом?
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation as an
import control
# First set up the figure, the axis, and the plot element we want to animate
fig = plt.figure()
ax = plt.axes(xlim=(-2, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)
# initialization function: plot the background of each frame
def init():
line.set_data([], [])
return line,
# animation function. This is called sequentially
def animate(i):
G = control.TransferFunction((1),(1,0))
real, imag, w = control.nyquist(G)
line.set_data(real, imag)
return line,**
# call the animator. blit=True means only re-draw the parts that have changed.
anim = an.FuncAnimation(fig, animate, init_func=init,
frames=200, interval=200, blit=True)
#anim.save('GIF.gif', dpi=100, writer='imagemagick')
plt.title('Nyquist Diagram of 1/s')
plt.ylabel('Imaginary')
plt.xlabel('Real')
plt.grid(True)
plt.show()
1 ответ
В вашем коде вы всегда строите текущие данные (реальные и imag), но в соответствии с matplotlib вам нужно использовать список данных, который обновляется на каждой итерации. Матплотлиб - Анимация
В приведенном ниже коде я создал списки realData и imagData, поэтому в каждой итерации real и imag добавляются в список, и эти списки используются в качестве аргументов line.set_data.
Я также использовал пакет управления только в начале, потому что он уже возвращает список, содержащий все, что вам нужно построить.
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation as an
import control
# First set up the figure, the axis, and the plot element we want to animate
fig, ax = plt.subplots()
realData, imagData = [], []
line, = plt.plot([], [], 'rx', animated=True)
G = control.TransferFunction((1),(1,0))
real, imag, w = control.nyquist(G)
print(real)
print(imag)
def init():
ax.set_xlim(-2, 2)
ax.set_ylim(-10, 10)
return line,
# animation function. This is called sequentially
def animate(i):
realData.append(real[i])
imagData.append(imag[i])
line.set_data(realData, imagData)
return line,
# call the animator. blit=True means only re-draw the parts that have changed.
anim = an.FuncAnimation(fig, animate, init_func=init,
frames=range(len(real)), interval=2, blit=True)
#anim.save('GIF.gif', dpi=100, writer='imagemagick')
plt.title('Nyquist Diagram of 1/s')
plt.ylabel('Imaginary')
plt.xlabel('Real')
plt.grid(True)
plt.show()