matplotlib
〜interactively
プロットの一部はpatches
とpoints
です。matplotlib:プロットからパッチを削除する
私はキューを介して別のプロセスからデータを受け取り、それらを私のプロットプロセスに送ります。コードのその部分は正常に機能し、ポイントはグラフに表示され、期待どおりにプロット内で継続的に更新されます。
ユーザからのご要望に応じて、私はプロット内のすべての古いパッチを削除し、新しいパッチで置き換えたいと思います。
私はそれを実行するのに十分だろうと思った:
# remove the old patch
patch.remove()
# I also tried ax.cla() without any success
# create a new patch
monitor_box = path.Path([(305, 500), (11, -213), (300, -220), (500, 1734)])
patch = patches.PathPatch(monitor_box, facecolor='black', lw=1)
# add the patch to the axis
ax.add_patch(patch)
、その後、次の反復の間に、プロットは、新しいパッチで更新する必要があります。
canvas.draw()
が、私は上記のコードを使用します、パッチはまだウィンドウに残り、何も変わりません。 (私はまだプロットのポイントを得ているので、それでも少なくとも継続的に更新されています)
以下、問題の最小限の実例を示しました。コードを実行すると、異なる点がプロットされますが、パッチは削除されません。
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
import multiprocessing
from Tkinter import *
import matplotlib.path as path
import matplotlib.patches as patches
import sys, thread, time
from random import randint
#Create a window
window=Tk()
sendProximityInfo = True
latest_published_msg = ""
def erasePatchesAndCreateNew_A():
print "erasePatchesAndCreateNew_A"
global line, ax, canvas
global monitor_box
global patch
patch.remove()
ax.cla()
monitor_box = path.Path([(35, 1677), (11, -213), (652, -220), (500, 1734)])
patch = patches.PathPatch(monitor_box, facecolor='black', lw=1)
ax.add_patch(patch)
def erasePatchesAndCreateNew_B():
print "erasePatchesAndCreateNew_B"
global line, ax, canvas
global monitor_box
global patch
patch.remove()
ax.cla()
monitor_box = path.Path([(35, 500), (11, -213), (300, -220), (500, 1734)])
patch = patches.PathPatch(monitor_box, facecolor='red', lw=1)
ax.add_patch(patch)
monitor_box = path.Path([(35, 1677), (111, -213), (62, -220), (800, 1734)])
fig = matplotlib.figure.Figure()
ax = fig.add_subplot(1,1,1)
ax.set_xlim(-1500,2000)
ax.set_ylim(-1500,2000)
patch = patches.PathPatch(monitor_box, facecolor='black', lw=1)
ax.add_patch(patch)
def main():
erasePatchesAndCreateNew_B()
#Create a queue to share data between process
q = multiprocessing.Queue()
#Create and start the simulation process
simulate = multiprocessing.Process(None, simulation,args=(q,))
simulate.start()
#Create the base plot
plot()
#Call a function to update the plot when there is new data
updateplot(q)
window.mainloop()
print 'Done'
simulate.join() # wait for the other process to finish as well
def plot(): #Function to create the base plot, make sure to make global the lines, axes, canvas and any part that you would want to update later
global line, ax, canvas
global monitor_box
global patch
fig = matplotlib.figure.Figure()
ax = fig.add_subplot(1,1,1)
ax.set_xlim(-1500,2000)
ax.set_ylim(-1500,2000)
patch = patches.PathPatch(monitor_box, facecolor='black', lw=1)
ax.add_patch(patch)
ax.invert_yaxis()
canvas = FigureCanvasTkAgg(fig, master=window)
canvas.show()
canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1)
line, = ax.plot([], [], 'ro')
def updateplot(q):
try: #Try to check if there is data in the queue
result = q.get_nowait()
if result != 'Q':
x, y = result
line.set_data(x, y)
ax.draw_artist(line)
canvas.draw()
window.after(1,updateplot,q)
else:
print 'done'
except:
window.after(1,updateplot,q)
def simulation(q):
try:
while True:
for i in range(10):
q.put((randint(0,1500), randint(0,1500)))
time.sleep(1)
erasePatchesAndCreateNew_A()
time.sleep(1)
for i in range(10):
q.put((randint(0,1500), randint(0,1500)))
time.sleep(1)
erasePatchesAndCreateNew_B()
time.sleep(1)
except KeyboardInterrupt:
print "received KeyboardInterrupt"
finally:
print "simulation ended"
sys.exit()
if __name__ == '__main__':
main()
以下はプログラムのスクリーンショットです。赤い点がグラフ内を移動しますが、パッチ(黒い形)は決して変化しません。
。だから、あなたは何を期待していますか? – ImportanceOfBeingErnest
@ImportanceOfBeingErnestコードの一部を追加しなかっただけで、configureForPortrait()とconfigureForLandscape()はコードのどこかから呼び出されます。 – theAlse
[MCVE]がなければ、問題を見つけることはほとんど不可能です。一方、そのような[MCVE]の作成はそれほど難しいことではありません。私の意見では、あなたが1つを作るのに気を使うことができないならば、なぜ誰かがあなたのための解決策を見つけるのに気をつけなければなりません。 – ImportanceOfBeingErnest