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
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


--
                   _
|\/|o _|_  _. _ | | \.__  __|__|_|_  _  _ ._ _
|  ||(_| |(_|(/_| |_/|(_)(/_|_ |_|_)(_)(_)| | |

http://www.droettboom.com

------------------------------------------------------------------------------
Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce.
With Perforce, you get hassle-free workflows. Merge that actually works. 
Faster operations. Version large binaries.  Built-in WAN optimization and the
freedom to use Git, Perforce or both. Make the move to Perforce.
http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to