2016-09-23 3 views
0

私は、円を描くアニメーションを生成する次のコードを持っています。マーカーを頭にする線をプロットする

from math import cos, sin 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

def update_plot(num, x, y, line): 
    line.set_data(x[:num], y[:num]) 
    line.axes.axis([-1.5, 1.5, -1.5, 1.5]) 
    return line 

def plot_circle(): 
    x = [] 
    y = [] 
    for i in range(100): 
     x.append(cos(i/10.0)) 
     y.append(sin(i/10.0)) 

    fig, ax = plt.subplots() 
    line, = ax.plot(x, y, color = "k") 
    ani = animation.FuncAnimation(fig, update_plot, len(x), fargs=[x, y, line], interval = 1, blit = False) 
    plt.show() 

plot_circle() 

ラインは完全なラップより長い、そしてそのラインが重なったときに、まだ、私が描かれているかを示してマーカーを希望の図面を見ることができます。私は

scat = plt.scatter(0, 0) 
ani = animation.FuncAnimation(fig, update_plot, len(x), fargs=[x, y, line, scat], interval = 1, blit = False) 

のように、更新の呼び出しに散布図を追加し、成功せずupdate_plotx[num]y[num]を使用して散布図の点の位置を更新しようとしてみました。どうすればこの効果を達成できますか?

答えて

0

散布図を同じアニメーションに追加する方法が見つかりました。キーはscat.set_offsetsを使用してデータを設定することでした。必要な変更は次のとおりです。

def update_plot(num, x, y, line, scat): 
    # ... 
    scat.set_offsets([x[num - 1], y[num - 1]]) 
    return line, scat 

def plot_circle(): 
    # ... 
    scat = ax.scatter([0], [0], color = 'k') # Set the dot at some arbitrary position initially 
    ani = animation.FuncAnimation(fig, update_plot, len(x), fargs=[x, y, line, scat], interval = 1, blit = False) 
    plt.show() 
1

scatupdate_plot()に返す必要があります。ここ

markevery引数で線を引く、別の方法である:例えば

line.set_data(x[:num][::-1], y[:num][::-1]) 

line, = ax.plot(x, y, "-o", color="k", markevery=100000) 
ポイントの順序を逆

import numpy as np 
import pylab as pl 

t = np.linspace(0, 2, 100) 
x = np.cos(t) 
y = np.sin(t) 

pl.plot(x[::-1], y[::-1], "-o", markevery=10000) 

出力:

enter image description here

+0

本当に面白い解決策! – pingul

関連する問題