>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
------------------------------------------------------------------------------
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