我正在尝试使用matplotlib创建一个图形来反映实时结果。我可能没有正确地执行此操作,因为移动窗口、更改窗口或单击某些内容会导致图形冻结。下面是我的意思的一个例子。
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def function1(fig, varse):
ax = fig.add_subplot(111, projection='3d')
color_grade_classes = ['#80FF00','#FFFF00','#FF8000', '#FF0000']
varse = varse +1
ax.set_xlabel('X')
ax.set_ylabel('Y')
for colors, rows in zip(color_grade_classes, [3,2,1,0] ):
indexs = np.arange(5)
heights = [varse,varse/2,varse/3,0,0]
ax.bar(indexs, heights, zs = rows, zdir='y', color=colors, alpha=0.8)
plt.ion()
plt.draw()
plt.show()
plt.ioff()
return varse
varse = 0
plt.ion()
fig = plt.figure()
plt.ioff()
while(1):
varse = function1(fig, varse)发布于 2012-04-06 06:52:12
我解决的方法是使用tk作为gui:
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import random
import numpy as np
import sys
import Tkinter as tk
import time
def function1(fig, ax):
ax.cla()
color_grade_classes = ['#80FF00','#FFFF00','#FF8000', '#FF0000']
varsi = random.randint(1, 100)
for colors, rows in zip(color_grade_classes, [3,2,1,0] ):
indexs = np.arange(5)
heights = [varsi,varsi/2,varsi/3,0,0]
ax.bar(indexs, heights, zs = rows, zdir='y', color=colors, alpha=0.8)
return fig
class App():
def __init__(self):
self.root = tk.Tk()
self.root.wm_title("Embedding in TK")
self.fig = plt.figure()
self.ax = self.fig.add_subplot(111, projection='3d')
self.ax.set_xlabel('X')
self.ax.set_ylabel('Y')
self.fig = function1(self.fig, self.ax)
self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
self.toolbar = NavigationToolbar2TkAgg( self.canvas, self.root )
self.toolbar.update()
self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
self.label = tk.Label(text="")
self.label.pack()
self.update_clock()
self.root.mainloop()
def update_clock(self):
self.fig = function1(self.fig,self.ax)
self.canvas.show()
self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
now = time.strftime("%H:%M:%S")
self.label.configure(text=now)
self.root.after(1000, self.update_clock)
app=App()这使我可以在显示后保留对图形的控制,并且当我试图移动窗口时,它不会冻结。
发布于 2012-04-04 04:32:37
这可能是this question的副本。
无论如何,我对你制作动画的方式持怀疑态度。这看起来不像任何matplotlib animation examples,也不遵循(我认为是旧的) advice here。
这些示例中的大多数都以plt.show()结束;就像任何其他甚至是驱动的图形用户界面编程系统一样(因为matplotlib的核心就是它),如果您想让东西正常工作,您需要将控制权交给它的事件循环,并学习在该框架的动画条款中工作。
发布于 2015-08-26 22:21:15
我在尝试实时绘制一些曲线时也遇到了同样的问题。一种快速的解决方法是在绘图函数中添加绘图暂停。
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def function1(fig, varse):
ax = fig.add_subplot(111, projection='3d')
color_grade_classes = ['#80FF00','#FFFF00','#FF8000', '#FF0000']
varse = varse +1
ax.set_xlabel('X')
ax.set_ylabel('Y')
for colors, rows in zip(color_grade_classes, [3,2,1,0] ):
indexs = np.arange(5)
heights = [varse,varse/2,varse/3,0,0]
ax.bar(indexs, heights, zs = rows, zdir='y', color=colors, alpha=0.8)
plt.draw()
plt.pause(0.001)
return varse
varse = 0
plt.ion()
fig = plt.figure()
plt.show()
while(1):
varse = function1(fig, varse)https://stackoverflow.com/questions/9999816
复制相似问题