首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matplotlib draw()冻结窗口

matplotlib draw()冻结窗口
EN

Stack Overflow用户
提问于 2012-04-04 03:13:05
回答 4查看 12.1K关注 0票数 4

我正在尝试使用matplotlib创建一个图形来反映实时结果。我可能没有正确地执行此操作,因为移动窗口、更改窗口或单击某些内容会导致图形冻结。下面是我的意思的一个例子。

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-06 06:52:12

我解决的方法是使用tk作为gui:

代码语言:javascript
复制
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()

这使我可以在显示后保留对图形的控制,并且当我试图移动窗口时,它不会冻结。

票数 2
EN

Stack Overflow用户

发布于 2012-04-04 04:32:37

这可能是this question的副本。

无论如何,我对你制作动画的方式持怀疑态度。这看起来不像任何matplotlib animation examples,也不遵循(我认为是旧的) advice here

这些示例中的大多数都以plt.show()结束;就像任何其他甚至是驱动的图形用户界面编程系统一样(因为matplotlib的核心就是它),如果您想让东西正常工作,您需要将控制权交给它的事件循环,并学习在该框架的动画条款中工作。

票数 1
EN

Stack Overflow用户

发布于 2015-08-26 22:21:15

我在尝试实时绘制一些曲线时也遇到了同样的问题。一种快速的解决方法是在绘图函数中添加绘图暂停。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9999816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档