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

问题描述 投票:0回答:1

我正在教自己python数学动画,所以我甚至不知道我问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中做些什么?一?另一个?都?如果是这样,我该怎么做。

python animation matplotlib
1个回答
0
投票

我不知道你怎么能把你的三个步骤连在一起,我不确定那是一种优雅的方式。

但是,我尝试使用以下代码创建“增长”Axes:

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

EDIT

实际上,我今天正在考虑这个问题,我想到了创建一个主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的尺寸限制

© www.soinside.com 2019 - 2024. All rights reserved.