Matplotlib + py3 + gtk3

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

···

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?

##############################################################################################################

#!/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,2np.pi,2np.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,2np.pi,2np.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,2np.pi,2np.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

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