在python和matplotlib中设置轴大小和2个连续动画的动画

时间:2017-12-27 18:24:07

标签: python animation matplotlib

我正在教自己蟒蛇数学动画,所以我甚至不知道我用matplotlib可以提出什么问题。我想要的是 (1)为轴开始小然后展开。在此之后,我想要它 (2)按顺序(一个接一个)绘制两条线而不是同时(同时)绘制两条线。 我的代码是下面的,除了我尝试扩展轴(最好的是我的尝试没有崩溃python)。

import time 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
#from matplotlib.animation import FuncAnimation


maxsize = 8
size = 1
fig = plt.figure(figsize=(maxsize, maxsize))
# fig will start at "size" if I ever figure out the animation
xmin = -10
xmax = 10
ymin = -10
ymax = 10
ax = plt.axes(xlim=(xmin, xmax), ylim=(ymin, ymax))
plt.axhline(linewidth=3, color='black')
plt.axvline(linewidth=3, color='black')
line, = ax.plot([], [], lw=2)


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

def animate1(i):
    x1 = np.linspace(-10, i/5 - 10, 1000)
    y1 = -1*x1
    line.set_data(x1, y1)
    return line,

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

def animate2(j):
    x2 = np.linspace(0, j/10, 1000)
    y2 = 2*x2
    line.set_data(x2, y2)
    return line,

plt.grid()
plt.xticks(np.arange(xmin, xmax+1, 1.0))
plt.yticks(np.arange(ymin, ymax+1, 1.0))

anim1 = animation.FuncAnimation(fig, animate1, init_func=init1, 
    frames=100, interval=20, blit=True) 
plt.plot() 
plt.show()
time.sleep(1)
anim2 = animation.FuncAnimation(fig, animate2, init_func=init2, 
    frames=100, interval=20, blit=True)
plt.plot() 
plt.show()

所以我想我的问题是: 我想在matplotlib中做什么?一?另一个?都? 如果是这样,我该怎么做。

1 个答案:

答案 0 :(得分:0)

我不知道如何将你的三个步骤联系在一起,我不确定是否有一种优雅的方式。

然而,我尝试创造一个"成长"轴代码如下:

fig_size_w = 9  # inches
fig_size_h = 9  # inches
ax_bottom_x = 0.1  # fig fraction
ax_bottom_y = 0.1  # fig fraction
ax_init_x = 0.1  # fig fraction
ax_init_y = 0.1  # fig fraction
ax_final_x = 0.9  # fig fraction
ax_final_y = 0.9  # fig fraction
grow_steps = 100  # number of steps in the growing process
xmin = -10
xmax = 10
ymin = -10
ymax = 10

grow_step_x = (ax_final_x - ax_init_x)/grow_steps
grow_step_y = (ax_final_y - ax_init_y)/grow_steps

fig = plt.figure(figsize=(fig_size_w, fig_size_h))
ax = fig.add_axes([ax_bottom_x, ax_bottom_y, 0, 0])

def init():
    ax.axhline(linewidth=3, color='black')
    ax.axvline(linewidth=3, color='black')
    ax.grid()
    ax.set_xticks(np.arange(xmin, xmax+1, 1.0))
    ax.set_yticks(np.arange(ymin, ymax+1, 1.0))

def animate(i):
    ax.set_position([ax_bottom_x, ax_bottom_y, (i+1)*grow_step_x, (i+1)*grow_step_y])


anim = matplotlib.animation.FuncAnimation(fig, animate, frames=grow_steps, init_func=init, interval=10)

enter image description here

修改

实际上,我今天正在考虑这个问题,我想到了创建一个主animate()函数,该函数接受一个包含一个框架列表的字典作为参数,并为每个函数执行一个函数指针。帧。 代码可以改进很多,但这个概念证明有效:

fig_size_w = 9  # inches
fig_size_h = 9  # inches
ax_bottom_x = 0.1  # fig fraction
ax_bottom_y = 0.1  # fig fraction
ax_init_x = 0.1  # fig fraction
ax_init_y = 0.1  # fig fraction
ax_final_x = 0.9  # fig fraction
ax_final_y = 0.9  # fig fraction
grow_steps = 100  # number of steps in the growing process
xmin = -10
xmax = 10
ymin = -10
ymax = 10

grow_step_x = (ax_final_x - ax_init_x)/grow_steps
grow_step_y = (ax_final_y - ax_init_y)/grow_steps

fig = plt.figure(figsize=(fig_size_w, fig_size_h))
ax = fig.add_axes([ax_bottom_x, ax_bottom_y, 0, 0])
line, = ax.plot([],[], lw=2)

def init():
    ax.axhline(linewidth=3, color='black')
    ax.axvline(linewidth=3, color='black')
    ax.grid()
    ax.set_xticks(np.arange(xmin, xmax+1, 1.0))
    ax.set_yticks(np.arange(ymin, ymax+1, 1.0))

def animate(i, func_dict):
    a = []
    for max_i,func in func_dict.items():
        if i < max_i:
            a = func(i)
            break
    return a

def func_grow(i):
    ax.set_position([ax_bottom_x, ax_bottom_y, (i+1)*grow_step_x, (i+1)*grow_step_y])
    return []

def func_pause(i):
    pass
    return []

def func_line1(i):
    i-=(grow_steps+100)  # need to remove offset value in i for it to start at 0
    x1 = np.linspace(-10, i/5 - 10, 1000)
    y1 = -1*x1
    line.set_data(x1, y1)
    return line,

def func_line2(j):
    j-=(grow_steps+300)  # need to remove offset value in j for it to start at 0
    x2 = np.linspace(0, j/10, 1000)
    y2 = 2*x2
    line.set_data(x2, y2)
    return line,


anim = matplotlib.animation.FuncAnimation(fig, animate, frames=grow_steps+400, init_func=init, interval=10, 
                                          fargs=({grow_steps: func_grow,
                                                  grow_steps+100: func_pause,
                                                  grow_steps+200: func_line1,
                                                  grow_steps+300: func_pause,
                                                  grow_steps+400: func_line2},))

3 animations in one!

注意:我不得不缩小图形的大小以适应imgur

的尺寸限制