2017-03-17 13 views
0

プロットのループ中に矢印の位置を更新したいと思います。私はこのパッチが矩形である状況に似た質問があるこのpostを見つけました。以下、上記の記事で提案されているソリューションにArrowパッチが追加されました。matplotlibの矢印位置を更新する

from matplotlib import pyplot as plt 
from matplotlib.patches import Rectangle, Arrow 
import numpy as np 

nmax = 10 
xdata = range(nmax) 
ydata = np.random.random(nmax) 


fig, ax = plt.subplots() 
ax.plot(xdata, ydata, 'o-') 
ax.xaxis.set_ticks(xdata) 
plt.ion() 

rect = plt.Rectangle((0, 0), nmax, 1, zorder=10) 
ax.add_patch(rect) 

arrow = Arrow(0,0,1,1) 
ax.add_patch(arrow) 

for i in range(nmax): 
    rect.set_x(i) 
    rect.set_width(nmax - i) 

    #arrow.what --> which method? 

    fig.canvas.draw() 
    plt.pause(0.1) 

Arrowパッチの問題点は、明らかに、Rectangleパッチの位置と関連した設定方法がないことです。あらゆるヒントは大歓迎です。

答えて

1

matplotlib.patches.Arrow実際には位置を更新する方法はありません。その変換を動的に変更することは可能ですが、最も簡単な解決策はアニメーションの各ステップでアニメーションを削除し、新しい矢印を追加することです。

from matplotlib import pyplot as plt 
from matplotlib.patches import Rectangle, Arrow 
import numpy as np 

nmax = 9 
xdata = range(nmax) 
ydata = np.random.random(nmax) 

plt.ion() 
fig, ax = plt.subplots() 
ax.set_aspect("equal") 
ax.plot(xdata, ydata, 'o-') 
ax.set_xlim(-1,10) 
ax.set_ylim(-1,4) 


rect = Rectangle((0, 0), nmax, 1, zorder=10) 
ax.add_patch(rect) 

x0, y0 = 5, 3 
arrow = Arrow(1,1,x0-1,y0-1, color="#aa0088") 

a = ax.add_patch(arrow) 

plt.draw() 

for i in range(nmax): 
    rect.set_x(i) 
    rect.set_width(nmax - i) 

    a.remove() 
    arrow = Arrow(1+i,1,x0-i+1,y0-1, color="#aa0088") 
    a = ax.add_patch(arrow) 

    fig.canvas.draw_idle() 
    plt.pause(0.4) 

plt.waitforbuttonpress()  
plt.show() 
関連する問題