

macOS Catalina(10.15.4)にインストールしたPython 3.8.1, Matplotlib 3.2.1, wxPython
4.0.7post2を用い，下記コードを実行すると４つのグラフが描画されます．しかしウィンドウのサイズを変えると初期画像が残ったまま，その下に拡大された画像が描画されてしまいます．エラーメッセージなどは表示されません．

Windowsでは問題なく再描画されます．どのようにコードを修正すればmacOSでも正しく描画されるようになるでしょうか？

[code]

    import wx
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
    from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
    import matplotlib.gridspec as gridspec
    import numpy as np
    
    class MainFrame(wx.Frame):
        def __init__(self):
            width, height = wx.GetDisplaySize()
            wx.Frame.__init__(self, None, -1,
                              size = (int(width *0.72), int(width*0.45)),
                              pos = (20, 20))
            self.ini_figures()
    
        def ini_figures(self):
            self.fig = Figure((8, 6))
            self.canvas = FigureCanvas(self, -1, self.fig)
            self.gs = gridspec.GridSpec(2,2)
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.mpl_toolbar = NavigationToolbar(self.canvas)
            self.mpl_toolbar.get_canvas(self, self.fig)
            self.mpl_toolbar.update()
            self.mpl_toolbar.Realize()
            self.sizer.Add(self.canvas, 1, wx.EXPAND, wx.EXPAND)
            self.sizer.Add(self.mpl_toolbar, 0, wx.EXPAND, wx.EXPAND)
            self.SetSizer(self.sizer)
            self.Fit()
            self.drawGraphs(self.fig, self.canvas, self.gs)
    
        def drawGraphs(self, fig, canvas, gs):
            x = np.linspace(1, 100)
            y1 = np.exp(x)
            y2 = np.log(x)
            y3 = np.sin(2*np.pi*x)
            y4 = np.cos(2*np.pi*x)
    
            fig.clear()
            self.axis1 = fig.add_subplot(gs[0,0])
            self.axis1.plot(x, y1,'+')
            self.axis2 = fig.add_subplot(gs[0,1])
            self.axis2.plot(x, y2,'+')
            self.axis3 = fig.add_subplot(gs[1,0])
            self.axis3.plot(x, y3,'+')
            self.axis4 = fig.add_subplot(gs[1,1])
            self.axis4.plot(x, y4,'+')
            canvas.draw()
    
    def main():
        app = wx.App()
        window = MainFrame()
        window.Show()
        app.MainLoop()
    
    if __name__ == "__main__":
        main()
    
[/code]


CC BY-SA 4.0
2020-03-26T01:13:25.407
64120
2020-03-26T15:35:29.350
38361
question
python3 macos matplotlib
macOS+matplotlib+wxPythonで描画したグラフウィンドウのリサイズ時に正しく再描画されない問題


症状が違うかもしれませんが、Windowsでもいったん小さくしてから大きくすると描画が乱れる状況は発生しました。  
Windows10で 64bit Python 3.8.2, Matplotlib 3.2.1, wxPython 4.0.7post2 の環境です。

それで、matplotlibの以下のサンプルを見ると、メインのグラフ領域の設定とツールバー領域の設定順番が逆になっていたので、それに合わせて変更したら、良い感じに動くようになりました。  
[user_interfaces example code:
embedding_in_wx2.py](https://matplotlib.org/examples/user_interfaces/embedding_in_wx2.html)

それを適用した結果のソースが以下になります。変更箇所にコメントを入れています。  
macOSでどうなるか試してみてください。

[code]

    import wx
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
    from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
    import matplotlib.gridspec as gridspec
    import numpy as np
    
    class MainFrame(wx.Frame):
        def __init__(self):
            width, height = wx.GetDisplaySize()
            wx.Frame.__init__(self, None, -1,
                              size = (int(width *0.72), int(width*0.45)),
                              pos = (20, 20))
            self.ini_figures()
    
        def ini_figures(self):
            self.fig = Figure((8, 6))
            self.canvas = FigureCanvas(self, -1, self.fig)
            self.gs = gridspec.GridSpec(2,2)
            self.drawGraphs(self.fig, self.canvas, self.gs) # グラフを先に描く
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            # ツールバーは後で追加する
            self.sizer.Add(self.canvas, 1, wx.EXPAND, wx.EXPAND)
            self.SetSizer(self.sizer)
            self.Fit()
    
            self.add_toolbar() # matplotlibのサンプルのメソッドを呼び出し
    
        def drawGraphs(self, fig, canvas, gs):
            x = np.linspace(1, 100)
            y1 = np.exp(x)
            y2 = np.log(x)
            y3 = np.sin(2*np.pi*x)
            y4 = np.cos(2*np.pi*x)
    
            fig.clear()
            self.axis1 = fig.add_subplot(gs[0,0])
            self.axis1.plot(x, y1,'+')
            self.axis2 = fig.add_subplot(gs[0,1])
            self.axis2.plot(x, y2,'+')
            self.axis3 = fig.add_subplot(gs[1,0])
            self.axis3.plot(x, y3,'+')
            self.axis4 = fig.add_subplot(gs[1,1])
            self.axis4.plot(x, y4,'+')
            canvas.draw()
    
        # matplotlibのサンプルをコピー
        def add_toolbar(self):
            self.toolbar = NavigationToolbar(self.canvas)
            self.toolbar.Realize()
            self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
            self.toolbar.update()
    
    def main():
        app = wx.App()
        window = MainFrame()
        window.Show()
        app.MainLoop()
    
    if __name__ == "__main__":
        main()
    
[/code]


CC BY-SA 4.0
2020-03-26T15:35:29.350
64138
2020-03-26T15:35:29.350
26370
64120
answer