我正在教自己蟒蛇数学动画,所以我甚至不知道我用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中做什么?一?另一个?都? 如果是这样,我该怎么做。
答案 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)
实际上,我今天正在考虑这个问题,我想到了创建一个主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},))
注意:我不得不缩小图形的大小以适应imgur
的尺寸限制