<div dir="ltr">Hello David,<br><div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 16, 2015 at 5:55 AM, David Aldrich <span dir="ltr"><<a href="mailto:David.Aldrich@emea.nec.com" target="_blank">David.Aldrich@emea.nec.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div link="#0563C1" vlink="#954F72" lang="EN-GB">
<div>
<p class="MsoNormal">Hi<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">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:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">def create_plot(self):<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        self.fig, ((self.ax0, self.ax1), (self.ax2, self.ax3)) = plt.subplots(nrows=2, ncols=2)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        self.ax0.set_title("A")<u></u><u></u></p>
<p class="MsoNormal">        self.ax0.grid(True, lw = 2, ls = '--', c = '.75')<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        self.ax1.set_title("B")<u></u><u></u></p>
<p class="MsoNormal">        self.ax1.grid(True, lw = 2, ls = '--', c = '.75')<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        self.ax2.set_title("C")<u></u><u></u></p>
<p class="MsoNormal">        self.ax2.grid(True, lw = 2, ls = '--', c = '.75')<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        self.ax3.set_title("D")<u></u><u></u></p>
<p class="MsoNormal">        self.ax3.grid(True, lw = 2, ls = '--', c = '.75')<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        #plt.tight_layout()<u></u><u></u></p>
<p class="MsoNormal">        plt.show()<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        canvas = self.fig.canvas<u></u><u></u></p>
<p class="MsoNormal">        self.add_widget(canvas)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">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?<u></u><u></u></p>
<p class="MsoNormal"><u></u></p></div></div></blockquote><div><br></div><div>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.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div link="#0563C1" vlink="#954F72" lang="EN-GB"><div><p class="MsoNormal"> <u></u></p>
<p class="MsoNormal">Secondly, I want to periodically update the plotted lines, so I have a plot method that does this:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">    def plot(self,  xCoords, yCoords):<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        if len(self.ax0.lines) > 0:<u></u><u></u></p>
<p class="MsoNormal">            self.ax0.lines.pop(0)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        line = self.ax0.plot(xCoords, yCoords, color='blue')<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">        canvas = self.fig.canvas<u></u><u></u></p>
<p class="MsoNormal">        canvas.draw()<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Does that look ok?  Can I just pop the existing line, or should I reuse the existing line?</p></div></div></blockquote><div><br></div><div>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: <a href="http://matplotlib.org/examples/animation/animate_decay.html">http://matplotlib.org/examples/animation/animate_decay.html</a><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div link="#0563C1" vlink="#954F72" lang="EN-GB"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Lastly, and most difficult, if I enable:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal" style="text-indent:36pt">plt.tight_layout()<u></u><u></u></p>
<p class="MsoNormal" style="text-indent:36pt"><u></u> <u></u></p>
<p class="MsoNormal">I get an exception:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\matplotlib\tight_layout.py:225: UserWarning: tight_layout
 : fa</span><span style="font-size:10pt;font-family:"Arial",sans-serif;color:black;border:1pt none windowtext;padding:0cm">lling back to Agg renderer</span><span style="font-size:10pt;font-family:"Courier New";color:black"><u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   warnings.warn("tight_layout : falling back to Agg renderer")<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black"> Traceback (most recent call last):<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "main.py", line 1117, in <module><u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     GuiApp().run()<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\app.py", line 801, in run<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self.load_kv(filename=self.kv_file)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\app.py", line 598, in load_kv<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     root = Builder.load_file(rfilename)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 1801, in load_file<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     return self.load_string(data, **kwargs)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 1880, in load_string<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self._apply_rule(widget, parser.root, parser.root)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2038, in _apply_rule<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self._apply_rule(child, crule, rootrule)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2037, in _apply_rule<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self.apply(child)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 1924, in apply<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self._apply_rule(widget, rule, rule)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2038, in _apply_rule<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self._apply_rule(child, crule, rootrule)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2038, in _apply_rule<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self._apply_rule(child, crule, rootrule)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\lang.py", line 2035, in _apply_rule<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     child = cls(__no_builder=True)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\SVNProj\Raggio\trunk\hostconsole\gui\mygraph.py", line 127, in __init__<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self.create_plot()<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\SVNProj\Raggio\trunk\hostconsole\gui\mygraph.py", line 224, in create_plot<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     self.add_widget(canvas)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">   File "C:\Kivy-1.9.0-py3.4-win32-x64\Python34\lib\site-packages\kivy\uix\boxlayout.py", line 211, in add_widget<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black">     widget.bind(<u></u><u></u></span></p>
<p class="MsoNormal" style="background:rgb(250,250,250) none repeat scroll 0% 0%"><span style="font-size:10pt;font-family:"Courier New";color:black"> AttributeError: 'FigureCanvasAgg' object has no attribute 'bind'<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Can anyone help with that please?<u></u><u></u></p>
<p class="MsoNormal"><u></u></p></div></div></blockquote><div><br><br></div><div>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?).<br><br></div><div>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?<br><br><a href="http://www.amazon.com/Interactive-Applications-using-Matplotlib-Benjamin/dp/1783988843/">http://www.amazon.com/Interactive-Applications-using-Matplotlib-Benjamin/dp/1783988843/</a><br><br></div><div>Cheers!<br></div><div>Ben Root<br></div><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div link="#0563C1" vlink="#954F72" lang="EN-GB"><div><p class="MsoNormal"> <u></u></p>
<p class="MsoNormal">Best regards<span class=""><font color="#888888"><u></u><u></u></font></span></p><span class=""><font color="#888888">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">David<u></u><u></u></p>
</font></span></div>
</div>

<br>_______________________________________________<br>
Matplotlib-users mailing list<br>
<a href="mailto:Matplotlib-users@python.org">Matplotlib-users@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/matplotlib-users" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-users</a><br>
<br></blockquote></div><br></div></div></div>