2013-10-08 113 views
5

我想在我正在編寫的Python Gtk3應用程序中包含一個matplotlib圖。我想將圖形的背景顏色設置爲透明,以便該圖形只顯示與應用程序的自然灰色背景相對應的內容,但目前爲止我嘗試過的任何內容似乎都無法正常工作。強制matplotlib圖背景爲透明

下面是一個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() 

如果fig.patch.set_alpha(0.0)行註釋掉,背景的顏色只是改變爲白色,而不是灰色的。所有建議非常感謝!

+0

您確定在您的平臺上默認情況下,空的'Gtk.Window'背景不是白色嗎?這似乎是我的情況(Unity桌面)。 –

+0

不,我查了一下,它似乎是灰色的。我設法解決了這個問題,使用父窗口的get_style方法來獲取背景顏色,然後將其設置爲軸的面部顏色。這不是一個很好的解決方案,但它的工作原理。 – Donagh

回答

2

在我看來,這是需要隱藏的軸背景。您可以嘗試使用ax.patch.set_facecolor('None')ax.patch.set_visible(False)

另外,你有沒有嘗試設置圖和軸補丁?這可以通過以下方式完成:

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

不幸的是,我都不適合我。你能確認它確實在你的機器上工作嗎? – Donagh

+0

這兩種方法都至少在常規數字上刪除了軸補丁的顏色。我無法測試您的MWE,因爲缺少與GTK後端相關的可用模塊。 – spinup

+0

嗯...在我的系統上,都將背景顏色設置爲白色。我在下面發佈我的解決方案這不是普遍的,但它適用於我。 – Donagh

1

我這樣解決了。這不是理想的,但它的工作原理。

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