将matplotlib图的背景强制设置为透明

7

我正在编写一个Python Gtk3应用程序,想将一个matplotlib图形包含在其中。我希望将图形的背景色设置为透明,这样图形就只会显示在应用程序自然灰色的背景上,但是到目前为止,我尝试过的所有方法似乎都没有奏效。

以下是一个最小可行示例:

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)行,背景颜色只会改变为白色,而不是灰色。非常感谢您的建议!

你确定在你的平台上一个空的Gtk.Window的背景默认不是白色吗?对我来说似乎是这样(Unity桌面)。 - ali_m
不,我检查过了,它似乎是灰色的。我成功地通过使用父窗口的 get_style 方法获取背景颜色,然后将其设置为轴的面颜色来解决了这个问题。这不是一个很好的解决方案,但它有效。 - Donagh
3个回答

3

我认为需要隐藏的是坐标轴的背景。您可以尝试使用ax.patch.set_facecolor('None')ax.patch.set_visible(False)

另外,您是否尝试关闭图形和坐标轴的背景?可以通过以下方式实现:

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

很遗憾,对我来说都不起作用。你能确认它在你的机器上肯定可以工作吗? - Donagh
这里两种方式都可以移除轴补丁的颜色,至少在常规图中是这样。由于无法使用与GTK后端相关的可用模块,因此我无法测试您的MWE。 - SpinUp __ A Davis
嗯...在我的系统上,两者都将背景颜色设置为白色。我在下面发布了我的解决方案。它不是通用的,但对我有效。 - Donagh
1
我可以使用figure.patch.set_visible(False)来实现。 - dvdvck
我不得不同时使用 ax.patch.set_visible(False)figure.patch.set_visible(False) 来获得透明背景。 - HiFile.app - best file manager

2
我用这种方式解决了它。虽然不是最理想的,但它有效。
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()

这是我在使用matplotlib 3.4.1时唯一有效的解决方案。 - Roberto Leinardi

0

一种组合

fig.patch.set_visible(False)
self.setStyleSheet("background-color:transparent;")

对我来说可行(self是Canvas的子类)。任何一个单独使用都不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接