dyson
dyson

Reputation: 93

Modifying Matplotlib figure axes within PyQT4

I would like to create an application that embeds a Matplotlib animation within a PyQT4 GUI. I am trying to figure out the basics of how a FigureCanvasQTAgg object works, and am having trouble changing the axis limits once it is created. In the program below, a very simple figure is generated using the FigureCanvasQTAgg object, and I would like the press of the button to change the limits of the x-axis of the resulting plot. (Note that the following code is a simplified version of the code at the end of this post.)

import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class Window(QtGui.QDialog): 

def __init__(self):
    super(Window, self).__init__()
    self.fig = Figure()
    self.canvas = FigureCanvas(self.fig)
    self.ax = self.fig.add_subplot(111)  # create an axis
    self.ax.hold(False)  # discards the old graph
    self.ax.set_xlim([0, 100])
    self.ax.set_ylim([-10, 10])
    self.ax.set_xlabel('Random x label')
    self.button = QtGui.QPushButton('Adjust axes')
    self.button.clicked.connect(self.axis_adjust)

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

def axis_adjust(self):
    self.ax.set_xlim([0, 200])
    self.ax.set_xlabel('New label')


app = QtGui.QApplication(sys.argv)
ex = Window()
sys.exit(app.exec_())

Unfortunately, when I run my program and click the "Adjust axes" button, it has absolutely no effect. One thing I fundamentally do not understand is what the line self.canvas.draw() does. From a Matplotlib tutorial, I got the impression that this makes the figure actually appear within the GUI window...but this is not the case, because when I comment out the line self.canvas.draw(), the figure still appears within the GUI window. It is actually the line self.setLayout(layout) that makes the figure appear in the GUI window, which does not make sense from what I have read. It seems my lack of understanding of this functionality is at the root of my problem...

Upvotes: 2

Views: 1173

Answers (1)

gdlmx
gdlmx

Reputation: 6789

I wrote a simple application before. In my experience, self.canvas.draw() must be called after updating the settings or plotting a curve ( or any other object) using matplotlib functionalities. It is simply a function to trigger the update of any graphical objects. So just add self.canvas.draw() to the end of your callback function axis_adjust() should fix your problem.

FYI, the hierarchy of your UI will be QtGui.QDialog->QtGui.QVBoxLayout->FigureCanvas->matplotlib.figure.Figure

Upvotes: 1

Related Questions