2013-10-08 6 views
5

Ich versuche, eine Matplotlib-Figur in eine Python Gtk3-Anwendung, die ich schreibe, zu integrieren. Ich möchte die Hintergrundfarbe der Figur transparent machen, so dass die Figur nur gegen den natürlichen grauen Hintergrund der Anwendung erscheint, aber nichts, was ich bisher versucht habe, scheint zu funktionieren.Force Hintergrund der Matplotlib Figur transparent zu sein

Hier ist ein MWE:

from gi.repository import Gtk 
import matplotlib.pyplot as plt 
import matplotlib.lines as mlines 
import numpy as np 
from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas 

class MyWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self) 
     fig, ax = plt.subplots() 
     #fig.patch.set_alpha(0.0) 
     x,y = np.array([[0, 1], [0, 0]]) 
     line = mlines.Line2D(x, y, c='#729fcf') 
     ax.add_line(line) 
     plt.axis('equal') 
     plt.axis('off') 

     fig.tight_layout() 

     sw = Gtk.ScrolledWindow() 
     sw.set_border_width(50) 
     canvas = FigureCanvas(fig) 
     sw.add_with_viewport(canvas) 

     layout = Gtk.Grid() 
     layout.add(sw) 

     self.add(layout) 

win = MyWindow() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main() 

Wenn die fig.patch.set_alpha(0.0) Linie unkommentiert ist, die Farbe des Hintergrunds ändert sich nur weiß, sondern grau. Alle Vorschläge sehr geschätzt!

+0

Sind Sie sicher, dass der Hintergrund eines leeren 'Gtk.Window' standardmäßig nicht weiß auf Ihrer Plattform ist? das scheint für mich der Fall zu sein (Unity Desktop). –

+0

Nein, ich habe überprüft und es scheint grau zu sein. Es gelang mir, das Problem mit der Methode 'get_style' des Elternfensters zu umgehen, um die Hintergrundfarbe zu erhalten und sie dann als Facelicolor der Achsen zu setzen. Es ist keine großartige Lösung, aber es funktioniert. – Donagh

Antwort

2

Es scheint mir, dass es der Achsenhintergrund ist, der verborgen werden muss. Sie könnten versuchen, ax.patch.set_facecolor('None') oder ax.patch.set_visible(False) zu verwenden.

Oder haben Sie versucht, sowohl die Abbildung als auch die Achsen-Patches auszustellen? Dies kann erreicht werden durch:

for item in [fig, ax]: 
    item.patch.set_visible(False) 
+0

Funktioniert bei mir leider nicht. Können Sie bestätigen, dass es definitiv an Ihrem Gerät funktioniert? – Donagh

+0

Beide Wege entfernen hier die Farbe des Achsen-Patches, zumindest bei einer normalen Figur. Ich kann deine MWE nicht testen, da es keine verfügbaren Module für das GTK-Backend gibt. – spinup

+0

Hmmm ... auf meinem System setzen beide die Hintergrundfarbe auf Weiß. Ich habe meine Lösung unten gepostet. Es ist nicht universal, aber es funktioniert für mich. – Donagh

1

Ich löste es auf diese Weise. Es ist nicht ideal, aber es funktioniert.

from gi.repository import Gtk 
import matplotlib.pyplot as plt 
import matplotlib.lines as mlines 
import numpy as np 
from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas 
from matplotlib.colors import ColorConverter 

class MyWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self) 
     fig, ax = plt.subplots() 
     #fig.patch.set_alpha(0.0) 
     x,y = np.array([[0, 1], [0, 0]]) 
     line = mlines.Line2D(x, y, c='#729fcf') 
     ax.add_line(line) 
     plt.axis('equal') 
     plt.axis('off') 

     fig.tight_layout() 

     win = Gtk.Window() 
     style = win.get_style_context() 
     bg_colour = style.get_background_color(
     Gtk.StateType.NORMAL).to_color().to_floats() 
     cc = ColorConverter() 
     cc.to_rgba(bg_colour) 

     fig.patch.set_facecolor(bg_colour) 

     sw = Gtk.ScrolledWindow() 
     sw.set_border_width(50) 
     canvas = FigureCanvas(fig) 
     sw.add_with_viewport(canvas) 

     layout = Gtk.Grid() 
     layout.add(sw) 

     self.add(layout) 

win = MyWindow() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main()