2013-10-08 21 views
5

Próbuję dołączyć figurę matplotlib do aplikacji Python Gtk3, którą piszę. Chciałbym ustawić kolor tła figury jako przezroczysty, tak aby figura po prostu ukazała się na naturalnym szarym tle aplikacji, ale nic, co dotąd próbowałem, nie działa.Siła tła rysunku matplotlib jako przezroczystego

Oto 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() 

Jeśli linia fig.patch.set_alpha(0.0) jest komentarzem, kolor tła tylko zmieni się na biały, a nie szary. Wszystkie sugestie bardzo docenione!

+0

czy jesteś pewien, że tło pustego 'Gtk.Window' nie jest domyślnie białe na twojej platformie? wydaje mi się, że tak jest w moim przypadku (desktop Unity). –

+0

Nie, sprawdziłem i wydaje się być szary. Udało mi się ominąć problem za pomocą metody 'get_style' okna nadrzędnego, aby uzyskać kolor tła, a następnie ustawić go jako kolorystykę osi. To nie jest świetne rozwiązanie, ale działa. – Donagh

Odpowiedz

2

Wydaje mi się, że to tło osi musi zostać ukryte. Możesz spróbować użyć ax.patch.set_facecolor('None') lub ax.patch.set_visible(False).

Czy próbowałeś też wyłączyć poprawki figur i osi? Można to osiągnąć:

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

Niestety, niestety dla mnie nie działa. Czy możesz potwierdzić, że na pewno działa na twoim komputerze? – Donagh

+0

Oba sposoby usuwają tu kolor łaty, przynajmniej na zwykłej figurze. Nie mogę przetestować twojego MWE, z powodu braku dostępnych modułów związanych z backendem GTK. – spinup

+0

Hmmm ... w moim systemie, obie ustawić kolor tła na biały. Poniżej zamieściłem moje rozwiązanie. To nie jest uniwersalne, ale działa dla mnie. – Donagh

1

Rozwiązałem to w ten sposób. To nie jest idealne, ale działa.

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() 
Powiązane problemy