我有一个用wxPython编写的GUI,其中嵌入了matplotlib图形。我希望图的背景颜色与(非常大的)GUI的其余部分相同。遗憾的是,GUI的确切颜色取决于操作系统,因此仅设置固定的背景颜色是不够的,因为它会随操作系统而变化。因此我在创建matplotlib图时尝试使用facecolor='none'
。然而,这给出了一些意想不到的问题(见下图):每次重绘画布时,标签文本和刻度标记变得越来越厚,就好像字体的重量在变化一样。我找到this three years old question,它似乎处理了一个非常类似的问题,但它没有任何解决方案,也没有做什么的评论。这是matplotlib / wxpython的预期功能还是只是一个尚未修复的错误?
显示问题的示例代码。我创建了两个FigureCanvases,其中第一个具有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) # <-----------
答案 0 :(得分:2)
在摆弄了一点之后,我意识到问题可以通过在self.canvas_i.Refresh()
之后使用self.canvas_i.canvas.draw()
来解决。据我所知Refresh
将画布标记为“需要重绘”,迫使它完全重新绘制。这会覆盖任何旧的内容并使其只有一个旧的迭代(每个新的canvas.draw
只是在旧的顶部绘制新的东西,略微放置到一边给出“更粗的文本”)。