在wx中嵌入透明matplotlib图形画布

我有一个用wxPython编写的GUI,内嵌matplotlib图形。 我希望图形的背景颜色与(非常大)GUI的其余部分相同。 不幸的是,GUI的确切颜色是依赖于操作系统的,所以仅仅设置一个固定的背景颜色是不够的,因为它会随着操作系统而改变。 因此,我在创建matplotlib图时尝试使用facecolor='none' 。 但是,这出现了一些意想不到的问题(请参阅下图):每次重绘画布时,标签文本和刻度标记变得越来越厚,就好像字体重量正在改变一样。 我发现了这个三年前的问题,这个问题似乎涉及到一个非常类似的问题,但它没有任何解决方案,也没有关于怎么做的评论。 这是matplotlib / wxpython的预期功能,还是只是一个尚未修复的错误?

显示问题的示例代码。 我创建了两个FigureCanvas,其中第一个具有facecolor='b背景,并且在重facecolor='b时,文本不会变得更厚。 第二个画布使用facecolor='none' ,并为每个画布重绘提供更粗更粗的文本。

import wx
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg


class MyCanvas(wx.Panel):
    def __init__(self, parent, col):
        wx.Panel.__init__(self, parent, id=-1)

        self.fig = Figure(figsize=(1, 1), edgecolor='k', facecolor=col)
        self.ax = self.fig.add_subplot(1, 1, 1)
        self.ax.set_ylabel('Label')
        self.fig.subplots_adjust(left=0.5)
        self.canvas = FigureCanvasWxAgg(self, -1, self.fig)

        szr_ctr = wx.BoxSizer(wx.VERTICAL)
        szr_ctr.Add(self.canvas, 1, wx.ALL | wx.GROW)
        self.SetSizerAndFit(szr_ctr)

        wx.CallAfter(self.canvas.draw)


class wind(wx.Frame):

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent)

        self.i = 0
        figsizer = wx.BoxSizer(wx.HORIZONTAL)

        self.canvas1 = MyCanvas(self, col='b')
        figsizer.Add(self.canvas1, 1, wx.GROW | wx.ALL)

        self.canvas2 = MyCanvas(self, col='none')
        figsizer.Add(self.canvas2, 1, wx.GROW | wx.ALL)

        button = wx.Button(self, wx.ID_CLOSE, "Press me")
        button.Bind(wx.EVT_BUTTON, self.on_button)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(figsizer, 1, wx.ALL | wx.GROW, 10)
        sizer.Add(button, 0, wx.ALL, 10)


        self.SetSizer(sizer)
        self.Layout()
        self.Show()

    def on_button(self, event):
        wx.CallAfter(self.canvas1.canvas.draw)
        wx.CallAfter(self.canvas2.canvas.draw)


if __name__ == '__main__':
    wxapp = wx.App(redirect=False)
    v = wind(None, "Fig")
    wxapp.MainLoop()

蓝色背景图如预期般运作。 在none背景的情况下,几次画布重绘后,图形会变得更粗更粗的文本和轴线。


编辑

将重绘功能更改为(下)可以解决画布未正确重绘的问题。

def on_button(self, event):
    wx.CallAfter(self.canvas1.canvas.draw)
    wx.CallAfter(self.canvas2.canvas.draw)
    wx.CallAfter(self.canvas1.Refresh)  #  <-----------
    wx.CallAfter(self.canvas2.Refresh)  #  <-----------

逛了一下摆弄多之后,我意识到这个问题可以通过使用来解决self.canvas_i.Refresh()self.canvas_i.canvas.draw() 据我了解, Refresh会将画布标记为“需要重绘”,迫使其完全重新绘制。 这覆盖了所有旧内容,并且使其只是一个旧版本(每个新的canvas.draw只是在旧版本的canvas.draw绘制新的东西,略微放置到“较厚的文本”一侧)。

链接地址: http://www.djcxy.com/p/37909.html

上一篇: Embedding transparent matplotlib figure canvas in wx

下一篇: Graphs not updating (matplotlib)