= How to use Matplotlib - Part 1 (Phoenix) =
'''Keywords :''' Figure, Axes3D, Line2D, Subplot, FigureCanvasWxAgg, NavigationToolbar2WxAgg, Matplotlib, Pie chart, Bar graph, Line plot, Bar plot, Scatter plot, Histogram, Box plot, Stem plot, Heatmap.

<<TableOfContents>>

--------
= Demonstrating : =
__'''''Tested''' py3.x, wx4.x and Win10. ''__

Are you ready to use some samples ? ;)

Test, modify, correct, complete, improve and share your discoveries ! (!)

--------
== Matplotlib : ==
=== First example ===
{{attachment:img_sample_one.png}}

{{{#!python
# sample_one.py

"""

Link : https://matplotlib.org/3.3.1/gallery/user_interfaces/embedding_in_wx5_sgskip.html

"""

import os
import sys
from numpy import arange, sin, pi
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar2Wx
import wx

# class MyCanvasPanel
# class MyFrame
# class MyApp

#---------------------------------------------------------------------------

class MyCanvasPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        #------------

        # Simplified init method.
        self.CreateCtrls()
        self.DoLayout()

    #-----------------------------------------------------------------------

    def CreateCtrls(self):
        """
        ...
        """

        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)

        #------------

        self.canvas = FigureCanvas(self, -1, self.figure)

        #------------

        self.toolbar = NavigationToolbar2Wx(self.canvas)
        self.toolbar.Realize()


    def DoLayout(self):
        """
        ...
        """

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        self.SetSizer(sizer)
        self.Fit()


    def Draw(self):
        """
        ...
        """

        t = arange(0.0, 3.0, 0.01)
        s = sin(2 * pi * t)
        self.axes.plot(t, s)

#---------------------------------------------------------------------------

class MyFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, -1,
                          title,
                          size=(620, 620))

        #------------

        # Return icons folder.
        self.icons_dir = wx.GetApp().GetIconsDir()

        #------------

        # Simplified init method.
        self.SetProperties()
        self.CreateCtrls()

    #-----------------------------------------------------------------------

    def SetProperties(self):
        """
        ...
        """

        self.SetMinSize((620, 620))

        #------------

        frameIcon = wx.Icon(os.path.join(self.icons_dir,
                                         "wxwin.ico"),
                            type=wx.BITMAP_TYPE_ICO)
        self.SetIcon(frameIcon)


    def CreateCtrls(self):
        """
        ...
        """

        self.panel = MyCanvasPanel(self)
        self.panel.Draw()

#---------------------------------------------------------------------------

class MyApp(wx.App):
    def OnInit(self):

        #------------

        self.installDir = os.path.split(os.path.abspath(sys.argv[0]))[0]

        #------------

        frame = MyFrame("Sample one")
        self.SetTopWindow(frame)
        frame.Show(True)

        return True

    #-----------------------------------------------------------------------

    def GetInstallDir(self):
        """
        Return the installation directory for my application.
        """

        return self.installDir


    def GetIconsDir(self):
        """
        Return the icons directory for my application.
        """

        icons_dir = os.path.join(self.installDir, "icons")
        return icons_dir

#---------------------------------------------------------------------------

def main():
    app = MyApp(False)
    app.MainLoop()

#---------------------------------------------------------------------------

if __name__ == "__main__" :
    main()
}}}
--------
=== Second example ===
{{attachment:img_sample_two.png}}

{{{#!python
# sample_two.py

import os
import sys
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar2Wx
import wx

# class MyCanvasPanel
# class MyFrame
# class MyApp

#---------------------------------------------------------------------------

# Some data
# Pie chart, where the slices will be ordered and plotted counter-clockwise :
labels = 'Hogs', 'Frogs', 'Logs', 'Dogs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)  # Only "explode" the 2nd slice (i.e. 'Hogs').

#---------------------------------------------------------------------------

class MyCanvasPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        #------------

        # Simplified init method.
        self.CreateCtrls()
        self.DoLayout()

    #-----------------------------------------------------------------------

    def CreateCtrls(self):
        """
        ...
        """

        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)

        #------------

        self.canvas = FigureCanvas(self, -1, self.figure)

        #------------

        self.toolbar = NavigationToolbar2Wx(self.canvas)
        self.toolbar.Realize()


    def DoLayout(self):
        """
        ...
        """

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        self.SetSizer(sizer)
        self.Fit()


    def Draw(self):
        """
        ...
        """

        # Make figure and axes.
        self.axes.plot(1, 0)

        # To draw the pies.
        self.axes.pie(sizes,
                      labels=labels,
                      autopct='%1.1f%%',
                      textprops={'size': 'smaller'},
                      shadow=True,
                      radius=0.5,
                      startangle=90,
                      explode=explode)

        # Equal aspect ratio ensures that pie is drawn as a circle.
        self.axes.axis('equal')

        self.axes.legend(title="Hogs and dogs",
                         loc="center right",
                         bbox_to_anchor=(1, 0, 0, 1))
        self.axes.set_title("Raining hogs and dogs", bbox={'facecolor':'0.9', 'pad':8})

#---------------------------------------------------------------------------

class MyFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, -1,
                          title,
                          size=(640, 500))

        #------------

        # Return icons folder.
        self.icons_dir = wx.GetApp().GetIconsDir()

        #------------

        # Simplified init method.
        self.SetProperties()
        self.CreateCtrls()

    #-----------------------------------------------------------------------

    def SetProperties(self):
        """
        ...
        """

        self.SetMinSize((640, 500))

        #------------

        frameIcon = wx.Icon(os.path.join(self.icons_dir,
                                         "wxwin.ico"),
                            type=wx.BITMAP_TYPE_ICO)
        self.SetIcon(frameIcon)


    def CreateCtrls(self):
        """
        ...
        """

        self.panel = MyCanvasPanel(self)
        self.panel.Draw()

#---------------------------------------------------------------------------

class MyApp(wx.App):
    def OnInit(self):

        #------------

        self.installDir = os.path.split(os.path.abspath(sys.argv[0]))[0]

        #------------

        frame = MyFrame("Sample two")
        self.SetTopWindow(frame)
        frame.Show(True)

        return True

    #-----------------------------------------------------------------------

    def GetInstallDir(self):
        """
        Return the installation directory for my application.
        """

        return self.installDir


    def GetIconsDir(self):
        """
        Return the icons directory for my application.
        """

        icons_dir = os.path.join(self.installDir, "icons")
        return icons_dir

#---------------------------------------------------------------------------

def main():
    app = MyApp(False)
    app.MainLoop()

#---------------------------------------------------------------------------

if __name__ == "__main__" :
    main()
}}}
--------
=== Third example ===
{{attachment:img_sample_three.png}}

{{{#!python
# sample_three.py

"""

Link : https://white-wheels.hatenadiary.org/entry/20100327/p5

"""

import os
import sys
import numpy as np
import matplotlib
matplotlib.interactive(True)
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar2Wx
from mpl_toolkits.mplot3d import Axes3D
import wx

# class MyCanvasPanel
# class MyFrame
# class MyApp

#---------------------------------------------------------------------------

class MyCanvasPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        #------------

        self.parent = parent

        #------------

        # Simplified init method.
        self.CreateCtrls()
        self.DoLayout()

    #-----------------------------------------------------------------------

    def CreateCtrls(self):
        """
        ...
        """

        self.figure = Figure()
        self.figure.set_facecolor((1.,1.,1.))
        self.axes = self.figure.add_subplot(111)

        #------------

        self.canvas = FigureCanvas(self, -1, self.figure)
        # self.canvas.SetBackgroundColour(wx.Colour(100, 100, 100))

        #------------

        self.toolbar = NavigationToolbar2Wx(self.canvas)
        self.toolbar.Realize()

        #------------

        self.SetSize()


    def SetSize(self):
        """
        ...
        """

        size = tuple(self.parent.GetClientSize())
        self.canvas.SetSize(740, 740)
        self.figure.set_size_inches(float(size[0])/self.figure.get_dpi(),
                                    float(size[1])/self.figure.get_dpi())

    def DoLayout(self):
        """
        ...
        """

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.RIGHT| wx.TOP | wx.GROW)
        sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        self.SetSizer(sizer)
        self.Fit()


    def Draw(self):
        """
        ...
        """

        x = np.arange(-3, 3, 0.25)
        y = np.arange(-3, 3, 0.25)
        X, Y = np.meshgrid(x, y)
        Z = np.sin(X)+ np.cos(Y)

        ax = Axes3D(self.figure)
        ax.plot_wireframe(X, Y, Z)

#---------------------------------------------------------------------------

class MyFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, -1,
                          title,
                          size=(740, 740))

        #------------

        # Return icons folder.
        self.icons_dir = wx.GetApp().GetIconsDir()

        #------------

        # Simplified init method.
        self.SetProperties()
        self.CreateCtrls()

    #-----------------------------------------------------------------------

    def SetProperties(self):
        """
        ...
        """

        self.SetMinSize((740, 740))

        #------------

        frameIcon = wx.Icon(os.path.join(self.icons_dir,
                                         "wxwin.ico"),
                            type=wx.BITMAP_TYPE_ICO)
        self.SetIcon(frameIcon)


    def CreateCtrls(self):
        """
        ...
        """

        self.panel = MyCanvasPanel(self)
        self.panel.Draw()

#---------------------------------------------------------------------------

class MyApp(wx.App):
    def OnInit(self):

        #------------

        self.installDir = os.path.split(os.path.abspath(sys.argv[0]))[0]

        #------------

        frame = MyFrame("Sample three")
        self.SetTopWindow(frame)
        frame.Show(True)

        return True

    #-----------------------------------------------------------------------

    def GetInstallDir(self):
        """
        Return the installation directory for my application.
        """

        return self.installDir


    def GetIconsDir(self):
        """
        Return the icons directory for my application.
        """

        icons_dir = os.path.join(self.installDir, "icons")
        return icons_dir

#---------------------------------------------------------------------------

def main():
    app = MyApp(False)
    app.MainLoop()

#---------------------------------------------------------------------------

if __name__ == "__main__" :
    main()
}}}
--------
=== Fourth example ===
{{attachment:img_sample_four.png}}

{{{#!python
# sample_four.py

"""

Link : https://matplotlib.org/3.3.1/gallery/user_interfaces/embedding_in_wx5_sgskip.html

"""

import os
import sys
import wx
import wx.lib.agw.aui as aui
import matplotlib as mpl
from matplotlib.backends.backend_wxagg import (
    FigureCanvasWxAgg as FigureCanvas,
    NavigationToolbar2WxAgg as NavigationToolbar)

# class MyPlot
# class MyPlotNotebook
# class Myframe
# class MyApp

#---------------------------------------------------------------------------

class MyPlot(wx.Panel):
    def __init__(self, parent, id=-1, dpi=None, **kwargs):
        wx.Panel.__init__(self, parent, id=id, **kwargs)

        #------------

        self.figure = mpl.figure.Figure(dpi=dpi, figsize=(2, 2))

        #------------

        self.canvas = FigureCanvas(self, -1, self.figure)

        #------------

        self.toolbar = NavigationToolbar(self.canvas)
        self.toolbar.Realize()

        #------------

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.EXPAND)
        sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        self.SetSizer(sizer)

#---------------------------------------------------------------------------

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

        #------------

        self.nb = aui.AuiNotebook(self)

        #------------

        sizer = wx.BoxSizer()
        sizer.Add(self.nb, 1, wx.EXPAND)
        self.SetSizer(sizer)

    #-----------------------------------------------------------------------

    def Add(self, name="plot"):
        """
        ...
        """

        page = MyPlot(self.nb)
        self.nb.AddPage(page, name)
        return page.figure

#---------------------------------------------------------------------------

class MyFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, -1,
                          title,
                          size=(450, 350))

        #------------

        # Return icons folder.
        self.icons_dir = wx.GetApp().GetIconsDir()

        #------------

        # Simplified init method.
        self.SetProperties()
        self.CreateCtrls()

    #-----------------------------------------------------------------------

    def SetProperties(self):
        """
        ...
        """

        self.SetMinSize((450, 350))

        #------------

        frameIcon = wx.Icon(os.path.join(self.icons_dir,
                                         "wxwin.ico"),
                            type=wx.BITMAP_TYPE_ICO)
        self.SetIcon(frameIcon)


    def CreateCtrls(self):
        """
        ...
        """

        plotter = MyPlotNotebook(self)
        axes1 = plotter.Add('figure 1').gca()
        axes1.plot([1, 2, 3], [2, 1, 4])
        axes2 = plotter.Add('figure 2').gca()
        axes2.plot([1, 2, 3, 4, 5], [2, 1, 4, 2, 3])

#---------------------------------------------------------------------------

class MyApp(wx.App):
    def OnInit(self):

        #------------

        self.installDir = os.path.split(os.path.abspath(sys.argv[0]))[0]

        #------------

        frame = MyFrame("Sample four")
        self.SetTopWindow(frame)
        frame.Show(True)

        return True

    #-----------------------------------------------------------------------

    def GetInstallDir(self):
        """
        Return the installation directory for my application.
        """

        return self.installDir


    def GetIconsDir(self):
        """
        Return the icons directory for my application.
        """

        icons_dir = os.path.join(self.installDir, "icons")
        return icons_dir

#---------------------------------------------------------------------------

def main():
    app = MyApp(False)
    app.MainLoop()

#---------------------------------------------------------------------------

if __name__ == "__main__" :
    main()
}}}
--------
= Download source =
[[attachment:source.zip]]

--------
= Additional Information =
'''Link :'''

https://matplotlib.org/3.1.3/gallery/pie_and_polar_charts/pie_and_donut_labels.html#sphx-glr-gallery-pie-and-polar-charts-pie-and-donut-labels-py

https://matplotlib.org/3.1.3/tutorials/introductory/sample_plots.html

https://matplotlib.org/3.1.1/gallery/index.html

https://newville.github.io/wxmplot/overview.html

https://stackoverflow.com/questions/19898115/wxpython-with-matplotlib

https://stackoverflow.com/questions/18769870/matplotlib-wxpython-not-sizing-correctly-with-legend

https://discourse.matplotlib.org/t/a-wxpython-matplotlib-basemap-example/10220/10

https://wiki.wxpython.org/MatplotlibEquationEditor

https://wiki.wxpython.org/MatplotlibFourierDemo

https://intellipaat.com/blog/tutorial/python-tutorial/python-matplotlib/

http://www.python-simple.com/python-matplotlib/pie.php

https://umar-yusuf.blogspot.com/2016/08/embedding-matplotlib-figure-in-wxpython.html

- - - - -

https://wiki.wxpython.org/TitleIndex

https://docs.wxpython.org/

--------
= Thanks to =
Hatenadiary (sample_three.py coding), Matplotlib.org, the wxPython community...

--------
= About this page =
Date (d/m/y)     Person (bot)    Comments :

30/08/20 - Ecco (Created page for wxPython Phoenix).

--------
= Comments =
- blah, blah, blah....