|
From: Jon Roadley-B. <jon...@gm...> - 2014-03-01 22:42:43
|
>On 02/27/2014 06:58 PM, Jon Roadley-Battin wrote: >> Good evening, >> >> I am at present migrating an application of mine from py27+pygtk (with >> mpl) to py33+pygobject (gtk3) >> >> Unfortunately I am unable to use >> >> from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas >> from matplotlib.backends.backend_gtk3 import NavigationToolbar2GTK3 as NavigationToolbar >> >> Which is is on the examples ( >> http://matplotlib.org/examples/user_interfaces/embedding_in_gtk3_panzoom.html >> ) but is also the logical translation from what I presently have. >> This falls fowl of the cairo issue >> >> What I am having to use is backend_gtk3cairo. However this is being >> triggered >> >> raise ValueError("The Cairo backend can not draw paths longer than >> 18980 points.") >> >> I am generally plotting 7 x-y plots with upto 30,000 points. >> Now for now I have commented this out from my local install, is there >> a better/preferred/recommended alternative? > >This was put in there because cairo had (at least at the time) a hard >coded limit on path size, and getting a Python exception was IMHO >preferable to segfaulting and having the process go away. Are you >saying that when you comment it out, it's currently working? It may be >that cairo has fixed this limit in the intervening years. Can you >provide a simple, standalone example that reproduces the error? Using python33 & pygi-aio-3.10.2-win32_rev18 (to provide pygobject for windows:) Using: http://matplotlib.org/examples/user_interfaces/embedding_in_gtk3_panzoom.htmlas the baseline provides the following error: < File "c:\Python33\lib\site-packages\matplotlib\backends\backend_gtk3agg.py", line 52, in on_draw_event buf, cairo.FORMAT_ARGB32, width, height) NotImplementedError: Surface.create_for_data: Not Implemented yet. This has been mentioned a few times across the ml Modifying the example to use backend_gtk3cairo from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas from matplotlib.backends.backend_gtk3 import NavigationToolbar2GTK3 as NavigationToolbar Now the example runs and plots a nice sinewave (as expected). Modify the script to plot 7 waveforms, 100pts ############################################################################################################## #!/usr/bin/env python3 """ demonstrate NavigationToolbar with GTK3 accessed via pygobject """ from gi.repository import Gtk from matplotlib.figure import Figure import numpy as np from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas from matplotlib.backends.backend_gtk3 import NavigationToolbar2GTK3 as NavigationToolbar win = Gtk.Window() win.connect("delete-event", Gtk.main_quit ) win.set_default_size(400,300) win.set_title("Embedding in GTK") fig = Figure(figsize=(5,4), dpi=100) plt = fig.add_subplot(1,1,1) t = np.arange(0,2*np.pi,2*np.pi/100) a = np.sin(t + 0*(2*np.pi/7)) b = np.sin(t + 1*(2*np.pi/7)) c = np.sin(t + 2*(2*np.pi/7)) d = np.sin(t + 3*(2*np.pi/7)) e = np.sin(t + 4*(2*np.pi/7)) f = np.sin(t + 5*(2*np.pi/7)) g = np.sin(t + 6*(2*np.pi/7)) plt.plot(t,a) plt.plot(t,b) plt.plot(t,c) plt.plot(t,d) plt.plot(t,e) plt.plot(t,f) plt.plot(t,g) vbox = Gtk.VBox() win.add(vbox) # Add canvas to vbox canvas = FigureCanvas(fig) # a Gtk.DrawingArea vbox.pack_start(canvas, True, True, 0) # Create toolbar toolbar = NavigationToolbar(canvas, win) vbox.pack_start(toolbar, False, False, 0) win.show_all() Gtk.main() #################################################################################################################### This works, its only 100pts for 7 scatters so nothing unexpected. Modify the arange to create a time array of 30,000 pts. t = np.arange(0,2*np.pi,2*np.pi/30000) File "c:\Python33\lib\site-packages\matplotlib\backends\backend_cairo.py", line 143, in draw_path raise ValueError("The Cairo backend can not draw paths longer than 18980 points.") ValueError: The Cairo backend can not draw paths longer than 18980 points. The already mentioned raise to protect against a segfault. Edit backend_cairo to comment out the check: def draw_path(self, gc, path, transform, rgbFace=None): #if len(path.vertices) > 18980: # raise ValueError("The Cairo backend can not draw paths longer than 18980 points.") ctx = gc.ctx 7channel, 30,000 pts each is plotted just fine. Zoom rectangle is slow to render, but this is true for 100pts (so more a gtk3 thing than a cairo and multiple points thing) Final script: ####################################################################################################################### #!/usr/bin/env python3 """ demonstrate NavigationToolbar with GTK3 accessed via pygobject """ from gi.repository import Gtk from matplotlib.figure import Figure import numpy as np from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas #changed to use gtk3cairo from matplotlib.backends.backend_gtk3 import NavigationToolbar2GTK3 as NavigationToolbar win = Gtk.Window() win.connect("delete-event", Gtk.main_quit ) win.set_default_size(400,300) win.set_title("Embedding in GTK") fig = Figure(figsize=(5,4), dpi=100) plt = fig.add_subplot(1,1,1) t = np.arange(0,2*np.pi,2*np.pi/30000) # 30,000 pt time array for 7 signals a = np.sin(t + 0*(2*np.pi/7)) b = np.sin(t + 1*(2*np.pi/7)) c = np.sin(t + 2*(2*np.pi/7)) d = np.sin(t + 3*(2*np.pi/7)) e = np.sin(t + 4*(2*np.pi/7)) f = np.sin(t + 5*(2*np.pi/7)) g = np.sin(t + 6*(2*np.pi/7)) plt.plot(t,a) plt.plot(t,b) plt.plot(t,c) plt.plot(t,d) plt.plot(t,e) plt.plot(t,f) plt.plot(t,g) vbox = Gtk.VBox() win.add(vbox) # Add canvas to vbox canvas = FigureCanvas(fig) # a Gtk.DrawingArea vbox.pack_start(canvas, True, True, 0) # Create toolbar toolbar = NavigationToolbar(canvas, win) vbox.pack_start(toolbar, False, False, 0) win.show_all() Gtk.main() ###################################################################################################################### Hope this helps. or is useful JonRB |