title: Embedding transparent matplotlib figure canvas in wx
body: <p>I have a GUI written in wxPython with a matplotlib figure embedded.  I want the background color of the figure to be the same as the rest of the (quite large) GUI.  Unfortunately the exact color of the GUI is OS-dependent, so it is not enough to set a fixed background color since it will change with the OS.  Therefore I tried to use <code>facecolor='none'</code> when creating the matplotlib-figure.  However that gave some unexpected problems (see image below):  every time you redraw the canvas the label text and tick marks is getting thicker as if the weight of the font is changing.  I found <a href="https://stackoverflow.com/questions/13352311/transparency-issue-with-matplotlib-and-wxpython">this three years old question</a>, which seems to deal with a very similar problem, but it does not have any solution nor comments of what to do.  Is this an intended feature of matplotlib/wxpython or just a bug which as not yet been fixed?</p>
  
  <p>Example code to show the problem.  I create two FigureCanvases, where the first one has a <code>facecolor='b</code> background, and with it the text is not getting thicker when redrawing the canvas.  The second canvas is using <code>facecolor='none'</code>, and gives thicker and thicker text for each canvas redraw.</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>Figure with blue background works as expected.  Figure with <code>none</code> background gets thicker and thicker texts and axes-lines after a few canvas redraws.</p>
  
  <p><a href="https://i.stack.imgur.com/dEJjM.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/dEJjM.png" alt="enter image description here"></a></p>
  
  <hr>
  
  <p><strong>Edit</strong></p>
  
  <p>Changing the redraw-function to (below) solves the problem with the canvas not being properly redrawn.</p>
  
  <pre><code>def on_button(self, event):
      wx.CallAfter(self.canvas1.canvas.draw)
      wx.CallAfter(self.canvas2.canvas.draw)
      wx.CallAfter(self.canvas1.Refresh)  #  &lt;-----------
      wx.CallAfter(self.canvas2.Refresh)  #  &lt;-----------
  </code></pre>