[Matplotlib-users] Beginner questions about OO interface

David Aldrich David.Aldrich at EMEA.NEC.COM
Mon Nov 16 12:37:05 EST 2015


Hi Benjamin

Thanks for your reply.  I have looked at your book on Amazon but thought I should go for Sandro Tosi’s book initially, just to learn the basics of Matplotlib.  Perhaps I can get yours later ☺

Best regards

David

From: Benjamin Root [mailto:ben.v.root at gmail.com]
Sent: 16 November 2015 17:23
To: David Aldrich <David.Aldrich at EMEA.NEC.COM>
Cc: matplotlib-users at python.org
Subject: Re: [Matplotlib-users] Beginner questions about OO interface

Hello David,

On Mon, Nov 16, 2015 at 5:55 AM, David Aldrich <David.Aldrich at emea.nec.com<mailto:David.Aldrich at emea.nec.com>> wrote:
Hi

I am new to Matplotlib and am struggling a bit to differentiate between the OO and pyplot interfaces.  I’m actually working with the Kivy GUI framework and trying to plot 4 subplots on a single figure, to be displayed by Kivy.  Here’s a snippet of my code:

def create_plot(self):

        self.fig, ((self.ax0, self.ax1), (self.ax2, self.ax3)) = plt.subplots(nrows=2, ncols=2)

        self.ax0.set_title("A")
        self.ax0.grid(True, lw = 2, ls = '--', c = '.75')

        self.ax1.set_title("B")
        self.ax1.grid(True, lw = 2, ls = '--', c = '.75')

        self.ax2.set_title("C")
        self.ax2.grid(True, lw = 2, ls = '--', c = '.75')

        self.ax3.set_title("D")
        self.ax3.grid(True, lw = 2, ls = '--', c = '.75')

        #plt.tight_layout()
        plt.show()

        canvas = self.fig.canvas
        self.add_widget(canvas)

What worries me is that I am calling plt methods and assigning the results to my objects.  Is plt the state machine interface and not the OO interface, or is this OK?

Indeed, plt is the state machine interface, and it isn't exactly the same thing to say "plt.show()" and to show a particular figure. You can call `self.fig.show()`, though.


Secondly, I want to periodically update the plotted lines, so I have a plot method that does this:

    def plot(self,  xCoords, yCoords):

        if len(self.ax0.lines) > 0:
            self.ax0.lines.pop(0)

        line = self.ax0.plot(xCoords, yCoords, color='blue')

        canvas = self.fig.canvas
        canvas.draw()

Does that look ok?  Can I just pop the existing line, or should I reuse the existing line?

That would work, but it is very inefficient. Most matplotlib artist objects have some sort of "set_data()" or "set_offsets()" method that would let you update the data contained in the artist. See the following animation example: http://matplotlib.org/examples/animation/animate_decay.html


Lastly, and most difficult, if I enable:

plt.tight_layout()

I get an exception:

C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\matplotlib\tight_layout.py:225: UserWarning: tight_layout : falling back to Agg renderer
   warnings.warn("tight_layout : falling back to Agg renderer")
 Traceback (most recent call last):
   File "main.py", line 1117, in <module>
     GuiApp().run()
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\app.py", line 801, in run
     self.load_kv(filename=self.kv_file)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\app.py", line 598, in load_kv
     root = Builder.load_file(rfilename)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 1801, in load_file
     return self.load_string(data, **kwargs)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 1880, in load_string
     self._apply_rule(widget, parser.root, parser.root)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2038, in _apply_rule
     self._apply_rule(child, crule, rootrule)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2037, in _apply_rule
     self.apply(child)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 1924, in apply
     self._apply_rule(widget, rule, rule)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2038, in _apply_rule
     self._apply_rule(child, crule, rootrule)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2038, in _apply_rule
     self._apply_rule(child, crule, rootrule)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2035, in _apply_rule
     child = cls(__no_builder=True)
   File "C:\SVNProj\Raggio\trunk\hostconsole\gui\mygraph.py", line 127, in __init__
     self.create_plot()
   File "C:\SVNProj\Raggio\trunk\hostconsole\gui\mygraph.py", line 224, in create_plot
     self.add_widget(canvas)
   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\uix\boxlayout.py", line 211, in add_widget
     widget.bind(
 AttributeError: 'FigureCanvasAgg' object has no attribute 'bind'

Can anyone help with that please?

tight_layout() isn't the issue here (well, directly). The issue is that the canvas object that you added as a widget is not a widget as far as Kivy is concerned. It doesn't subclass anything that Kivy recognizes as a widget. By its very nature, FigureCanvasAgg is completely independent of any GUI frameworks. You would need to have selected the appropriate backend for matplotlib to use prior to importing pyplot (I don't know which one Kivy is compatible with, GTK? QT? something else?).
By the way, chapter 5 of my book, "Interactive Applications Using Matplotlib" goes into detail explaining the ins and outs of GUI embedding with matplotlib. While I don't cover Kivy, I do a Rosetta Stone-like explanation covering GTK, Qt4, Wx, and Tk, and I explain the general concepts. Perhaps it might be useful?

http://www.amazon.com/Interactive-Applications-using-Matplotlib-Benjamin/dp/1783988843/
Cheers!
Ben Root



Best regards

David

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
https://mail.python.org/mailman/listinfo/matplotlib-users



Click here<https://www.mailcontrol.com/sr/hMR6wrmFxrHGX2PQPOmvUg5!3elP1qzzXT9AmZTFOf3PtdjRxp3YcZ022EfPgnJAeE0+ZrrokCngE3KctAewCA==> to report this email as spam.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20151116/f783f1ce/attachment-0001.html>


More information about the Matplotlib-users mailing list