2017-12-27 282 views
0

我在教自己的python數學動畫,所以我甚至不知道我問的是否可以用matplotlib。我想要的是 (1)的軸開始小,然後展開。在此之後,我想要它 (2)順序(一個接一個地)繪製兩行,而不是同時(在同一時間),它正在做什麼。
我的代碼如下,除了我嘗試擴展軸(最好我的嘗試沒有崩潰蟒蛇)。在python和matplotlib中動畫軸的大小和2個連續的動畫

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

尺寸限制下我不清楚你想要什麼;讓我們試着澄清一下:'(1)軸從小到大,然後展開「,這是數字線上的某種縮放效果? (2)按順序繪製兩行而不是同時繪製你想繪製一條線,然後在另一條線上繪製(保留第一行)?或者你想顯示一個情節與第一個,然後另一個與第二個? –

+0

(1)我想讓軸開始小,讓我們說1「1」,然後長到8「8」。 (2)我想在一個繪圖上畫一條線,暫停,然後在同一個繪圖上繪製第二條線。 – SaintCad

回答

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