2015-05-10 1 views
3

Я создаю анимацию Matplotlib функции шага. Я использую следующий код ...Matplotlib анимация шага

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 

fig = plt.figure() 
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) 

line, = ax.step([], []) 

def init(): 
    line.set_data([], []) 
    return line, 

def animate(i): 
    x = np.linspace(0, 2, 10) 
    y = np.sin(2 * np.pi * (x - 0.01 * i)) 
    line.set_data(x, y) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=100, interval=20, blit=True) 

plt.show() 

Он смутно напоминает то, что я хочу (что-то вроде ниже GIF), но вместо значений постоянен и прокрутка с течением времени каждый шаг является динамичным и сдвигает вверх и вниз. Как бы изменился мой код, чтобы добиться этого изменения?

enter image description here

+0

Я немного смущен тем, что вы хотите изменить. Вы хотите сказать, что вам нужно увеличить значение оси x, чтобы это более четко прокручивалось? – seaotternerd

+0

@seaotternerd Да, я думаю, это то, что я хочу. В настоящее время шаги выглядят так, как будто они идут вверх и вниз на месте, и прокрутки не происходит. – Marmstrong

ответ

3

step явно участки шагов между точками ввода данных. Он никогда не может нарисовать частичный «шаг».

Вы хотите анимацию с «частичными шагами» между ними.

Вместо того, чтобы использовать ax.step, используйте ax.plot, но сделайте ступенчатую серию, построив y = y - y % step_size.

Другими словами, что-то вроде:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 1000) # Using a series of 1000 points... 
y = np.sin(x) 

# Make *y* increment in steps of 0.3 
y -= y % 0.3 

fig, ax = plt.subplots() 
ax.plot(x, y) 
plt.show() 

Обратите внимание, частичные «шаги» в начале и в конце enter image description here

Включение этого в вашем примере анимации, мы бы получить что-то похожее на:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 

fig = plt.figure() 
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) 

line, = ax.plot([], []) 

def init(): 
    line.set_data([], []) 
    return line, 

def animate(i): 
    x = np.linspace(0, 2, 1000) 
    y = np.sin(2 * np.pi * (x - 0.01 * i)) 
    y -= y % 0.3 
    line.set_data(x, y) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=100, interval=20, blit=True) 

plt.show() 

enter image description here

+0

Это решило мою проблему точно. Спасибо +1 – Marmstrong

+0

Будет ли способ сделать шаги равномерно распределенными? – Marmstrong