matplotlib draw () замораживает окно

Я пытаюсь использовать 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)
4 голоса | спросил user1170056 3 PMpTue, 03 Apr 2012 23:13:04 +040013Tuesday 2012, 23:13:04

4 ответа


0

Я решил использовать tk как графический интерфейс:

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()

Это позволяет мне сохранять контроль над графиком после того, как я его показываю, и он не останавливается, когда я пытаюсь переместить окно.

ответил user1170056 6 AMpFri, 06 Apr 2012 02:52:12 +040052Friday 2012, 02:52:12
0

Это может быть дубликат этого вопроса .

В любом случае, я сомневаюсь в том, как вы делаете анимацию. Это не похоже ни на один из примеров анимации matplotlib и не следует ( совет здесь . р>

Большинство из этих примеров заканчиваются plt.show(); Как и в любой другой, даже управляемой системе программирования GUI (потому что это то, что лежит в основе matplotlib), вам нужно передать управление его циклу событий и научиться работать в рамках этой инфраструктуры для анимации, если вы хотите, чтобы все работало правильно.

ответил timday 4 AMpWed, 04 Apr 2012 00:32:36 +040032Wednesday 2012, 00:32:36
0

У меня была та же проблема, когда я пытался построить некоторые кривые в реальном времени. Быстрое решение проблемы - добавить паузу в функцию печати. ​​

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)
ответил PouyaB 26 PM00000050000001531 2015, 17:21:15
0

Я решил это очень просто. В конце моего основного файла в python я добавил plt.show () в конец моего кода.

from matplotlib import pyplot as plt
#.
#. My code here 
#.

# Last line of code:
plt.show()
ответил DomDev 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 16 Sep 2016 18:31:22 +0300 2016, 18:31:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132