|
From: Michael D. <md...@st...> - 2014-03-03 03:10:33
|
Thanks. I'd definitely consider this a bug this. Would you mind creating an issue or pull request on github.com/matplotlib/matplotlib so it doesn't get lost? Mike On 03/01/2014 05:42 PM, Jon Roadley-Battin wrote: > >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.html > as 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 > > > > ------------------------------------------------------------------------------ > Flow-based real-time traffic analytics software. Cisco certified tool. > Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer > Customize your own dashboards, set traffic alerts and generate reports. > Network behavioral analysis & security monitoring. All-in-one tool. > http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk > > > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- _ |\/|o _|_ _. _ | | \.__ __|__|_|_ _ _ ._ _ | ||(_| |(_|(/_| |_/|(_)(/_|_ |_|_)(_)(_)| | | http://www.droettboom.com |