Matplotlib apagar e voltar a plotar

865 views
Skip to first unread message

Fabiano Bertuche

unread,
Jul 22, 2015, 1:38:03 PM7/22/15
to Python Brasil
Ola estou tentando fazer o seguinte:
a cada vez que o botão plotar é clicado acrescenta um ponto no gráfico e quando o botão apaga for apertado  apaga o gráfico e quando apertar o botão plotar volta a plotar o gráfico.

O problema é que não consigo fazer o botão apagar limpar o gráfico e quando consigo fazer o botão limpar o botão plotar não volta a plotar o gráfico

alguém poderia me dar um help???

import sys
from PyQt4 import QtGui

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
import matplotlib.pyplot as plt

import random
x2=[0]
y2=[0]
t1=1
t2=1
class Window(QtGui.QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)

# a figure instance to plot on
self.figure = plt.figure()

# this is the Canvas Widget that displays the `figure`
# it takes the `figure` instance as a parameter to __init__
self.canvas = FigureCanvas(self.figure)

# this is the Navigation widget
# it takes the Canvas widget and a parent
self.toolbar = NavigationToolbar(self.canvas, self)

# Just some button connected to `plot` method
self.button = QtGui.QPushButton('Plot')
self.button.clicked.connect(self.plot)

# Just some button connected to `plot` method
self.button1 = QtGui.QPushButton('apaga')
self.button1.clicked.connect(self.apaga)

# set the layout
layout = QtGui.QVBoxLayout()
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
layout.addWidget(self.button)
layout.addWidget(self.button1)
self.setLayout(layout)


def apaga(self):
#plt.ion()
#self.figure.clear()
print("apaga")



def plot(self):
''' plot some random stuff '''
# random data
data = [random.random() for i in range(10)]

# create an axis
ax = self.figure.add_subplot(111)

# discards the old graph
# ax.hold(False)

# plot data
x=[0,10,20,30,40,50,100,150]
y=[3,4,5,1,10,6,0,7]
global x2, y2 ,t1, t2
x2.append(t1)
y2.append(t2)

# plt.plot(data, '*-')
plt.clf()

plt.plot(x,y,'*-')
plt.plot(x2,y2,'*-')
print (x2)
t1 = t1+10
t2 = t2+10



# refresh canvas
self.canvas.draw()

if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)

main = Window()
main.show()

sys.exit(app.exec_())

Lucas de Biaggi Januário

unread,
Jul 22, 2015, 2:09:11 PM7/22/15
to python...@googlegroups.com
Boa tarde Fabiano,
            A plotagem quando você limpa a imagem .clf() deixa a imagem ainda em aberto em background, por isso quando você tenta realizar a segunda plotagem a imagem é reaproveitada, recomendo que você realize um .close() antes de iniciar uma replotagem ( não sei se seria o termo correto para essa ação)

Estou enviando um post do stackoverflow¹ que explica bem no detalhe o assunto.




--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Fabiano Bertuche

unread,
Jul 22, 2015, 3:45:10 PM7/22/15
to Python Brasil
Ola Amigo no exemplo anterior sua sugestão deu certo porem no modelo real ele não funcionou... Por isso posto meu codigo novamente mais dessa vez semelhante a situação real.

São 3 arquivos :
 1° é um arquivo gerado pelo qtDesigner 
 2: uma classe para o matplotlib
 3: o programa em questão

abaixo os arquivos:
1° form.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'form.ui'
#
# Created: Thu Jul 16 08:14:34 2015
#      by: PyQt4 UI code generator 4.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))

        """ Subistituir a atribuição desta instancia   """
        #self.mplwidget = QtGui.QWidget(self.centralwidget)
        self.mplwidget = MatplotlibWidget(self.centralwidget)
        self.mplwidget.setGeometry(QtCore.QRect(30, 40, 581, 411))
        self.mplwidget.setObjectName(_fromUtf8("mplwidget"))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)

        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(50, 500, 201, 61))
        self.pushButton.setFont(font)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))


        self.pushButton1 = QtGui.QPushButton(self.centralwidget)
        self.pushButton1.setGeometry(QtCore.QRect(400, 500, 201, 61))
        self.pushButton1.setObjectName(_fromUtf8("apaga"))


        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))

"""    Add essa parte        """
from matplotlibwidget import MatplotlibWidget

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
        QtGui.QMainWindow.__init__(self, parent, f)


o 2° matplotlibwidget.py

from PyQt4.QtGui import QSizePolicy
from PyQt4.QtCore import QSize
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as Canvas
from matplotlib.figure import Figure
from matplotlib import rcParams
import matplotlib.pyplot as plt

rcParams['font.size'] = 9

class MatplotlibWidget(Canvas):

    def __init__(self, parent=None, title='', xlabel='', ylabel='',
                 xlim=None, ylim=None, xscale='linear', yscale='linear',
                 width=4, height=3, dpi=100, hold=False):
        self.figure = Figure(figsize=(width, height), dpi=dpi)
        self.axes = self.figure.add_subplot(111)
        self.axes.set_title(title)
        self.axes.set_xlabel(xlabel)
        self.axes.set_ylabel(ylabel)
        if xscale is not None:
            self.axes.set_xscale(xscale)
        if yscale is not None:
            self.axes.set_yscale(yscale)
        if xlim is not None:
            self.axes.set_xlim(*xlim)
        if ylim is not None:
            self.axes.set_ylim(*ylim)
        #self.axes.hold(hold)

        Canvas.__init__(self, self.figure)
        self.setParent(parent)

        Canvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        Canvas.updateGeometry(self)


#===============================================================================
#   Example
#===============================================================================
if __name__ == '__main__':
    import sys
    from PyQt4.QtGui import QMainWindow, QApplication
    from numpy import linspace

    class ApplicationWindow(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            self.mplwidget = MatplotlibWidget(self, title='Example', xlabel='Linear scale', ylabel='Log scale',hold=True, yscale='log')
            #self.mplwidget.setFocus()
            #self.setCentralWidget(self.mplwidget)
            #self.plot(self.mplwidget.axes)



        def plot(self, axes):
            x=0
           #x = linspace(-10, 10)
           # axes.plot(x, x**2)
           #axes.plot(x, x**3)



    app = QApplication(sys.argv)
    win = ApplicationWindow()
    win.show()
    sys.exit(app.exec_())

e o 3° inicio.py

from PyQt4 import QtGui, QtCore
from form import MainWindow

class Window(MainWindow):
    def __init__(self):
        MainWindow.__init__(self)


        QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL('clicked()'),self.apaga)
        QtCore.QObject.connect(self.pushButton1,QtCore.SIGNAL('clicked()'),self.desenha)

    def apaga(self):
        self.mplwidget.figure.clf()
        self.mplwidget.close()
        print("apaga")

    def desenha(self):

        x=[0,10,20,30,40,50,100,150]
        y=[3,4,5,1,10,6,0,7]

        x2=[0,10,20,30,40,50,100,150]
        y2=[7,6,2,9,0,4,10,3]

        ax = self.mplwidget.figure.add_subplot(111)


        self.mplwidget.axes.plot(x,y)
        self.mplwidget.axes.plot(x2,y2)
        self.mplwidget.figure.canvas.draw()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

agradeço a ajuda

Reply all
Reply to author
Forward
0 new messages