精华内容
下载资源
问答
  • Matplotlib嵌入GUI界面

    千次阅读 2019-09-02 11:21:57
    1.将Matplotlib嵌入wxPython的GUI界面中 # -*- coding: utf-8 -*- import wx import numpy as np import matplotlib # matplotlib采用WXAgg为后台,将matplotlib嵌入wxPython中 matplotlib.use("WXAgg") from ...

    1.将Matplotlib嵌入wxPython的GUI界面中

    # -*- coding: utf-8 -*-
    
    import wx
    import numpy as np
    import matplotlib
    
    # matplotlib采用WXAgg为后台,将matplotlib嵌入wxPython中
    matplotlib.use("WXAgg")
    
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
    from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
    from matplotlib.ticker import MultipleLocator, FuncFormatter
    
    import pylab
    from matplotlib import pyplot
    
    
    ######################################################################################
    class MPL_Panel_base(wx.Panel):
        ''''' #MPL_Panel_base面板,可以继承或者创建实例'''
    
        def __init__(self, parent):
            wx.Panel.__init__(self, parent=parent, id=-1)
    
            self.Figure = matplotlib.figure.Figure(figsize=(4, 3))
            self.axes = self.Figure.add_axes([0.1, 0.1, 0.8, 0.8])
            self.FigureCanvas = FigureCanvas(self, -1, self.Figure)
    
            self.NavigationToolbar = NavigationToolbar(self.FigureCanvas)
    
            self.StaticText = wx.StaticText(self, -1, label='Show Help String')
    
            self.SubBoxSizer = wx.BoxSizer(wx.HORIZONTAL)
            self.SubBoxSizer.Add(self.NavigationToolbar, proportion=0, border=2, flag=wx.ALL | wx.EXPAND)
            self.SubBoxSizer.Add(self.StaticText, proportion=-1, border=2, flag=wx.ALL | wx.EXPAND)
    
            self.TopBoxSizer = wx.BoxSizer(wx.VERTICAL)
            self.TopBoxSizer.Add(self.SubBoxSizer, proportion=-1, border=2, flag=wx.ALL | wx.EXPAND)
            self.TopBoxSizer.Add(self.FigureCanvas, proportion=-10, border=2, flag=wx.ALL | wx.EXPAND)
    
            self.SetSizer(self.TopBoxSizer)
    
            ###方便调用
            self.pylab = pylab
            self.pl = pylab
            self.pyplot = pyplot
            self.numpy = np
            self.np = np
            self.plt = pyplot
    
        def UpdatePlot(self):
            '''''#修改图形的任何属性后都必须使用self.UpdatePlot()更新GUI界面 '''
            self.FigureCanvas.draw()
    
        def plot(self, *args, **kwargs):
            '''''#最常用的绘图命令plot '''
            self.axes.plot(*args, **kwargs)
            self.UpdatePlot()
    
        def semilogx(self, *args, **kwargs):
            ''''' #对数坐标绘图命令 '''
            self.axes.semilogx(*args, **kwargs)
            self.UpdatePlot()
    
        def semilogy(self, *args, **kwargs):
            ''''' #对数坐标绘图命令 '''
            self.axes.semilogy(*args, **kwargs)
            self.UpdatePlot()
    
        def loglog(self, *args, **kwargs):
            ''''' #对数坐标绘图命令 '''
            self.axes.loglog(*args, **kwargs)
            self.UpdatePlot()
    
        def grid(self, flag=True):
            ''''' ##显示网格  '''
            if flag:
                self.axes.grid()
            else:
                self.axes.grid(False)
    
        def title_MPL(self, TitleString="wxMatPlotLib Example In wxPython"):
            ''''' # 给图像添加一个标题   '''
            self.axes.set_title(TitleString)
    
        def xlabel(self, XabelString="X"):
            ''''' # Add xlabel to the plotting    '''
            self.axes.set_xlabel(XabelString)
    
        def ylabel(self, YabelString="Y"):
            ''''' # Add ylabel to the plotting '''
            self.axes.set_ylabel(YabelString)
    
        def xticker(self, major_ticker=1.0, minor_ticker=0.1):
            ''''' # 设置X轴的刻度大小 '''
            self.axes.xaxis.set_major_locator(MultipleLocator(major_ticker))
            self.axes.xaxis.set_minor_locator(MultipleLocator(minor_ticker))
    
        def yticker(self, major_ticker=1.0, minor_ticker=0.1):
            ''''' # 设置Y轴的刻度大小 '''
            self.axes.yaxis.set_major_locator(MultipleLocator(major_ticker))
            self.axes.yaxis.set_minor_locator(MultipleLocator(minor_ticker))
    
        def legend(self, *args, **kwargs):
            ''''' #图例legend for the plotting  '''
            self.axes.legend(*args, **kwargs)
    
        def xlim(self, x_min, x_max):
            ''' # 设置x轴的显示范围  '''
            self.axes.set_xlim(x_min, x_max)
    
        def ylim(self, y_min, y_max):
            ''' # 设置y轴的显示范围   '''
            self.axes.set_ylim(y_min, y_max)
    
        def savefig(self, *args, **kwargs):
            ''' #保存图形到文件 '''
            self.Figure.savefig(*args, **kwargs)
    
        def cla(self):
            ''' # 再次画图前,必须调用该命令清空原来的图形  '''
            self.axes.clear()
            self.Figure.set_canvas(self.FigureCanvas)
            self.UpdatePlot()
    
        def ShowHelpString(self, HelpString="Show Help String"):
            ''''' #可以用它来显示一些帮助信息,如鼠标位置等 '''
            self.StaticText.SetLabel(HelpString)
    
            ################################################################
    
    
    class MPL_Panel(MPL_Panel_base):
        ''''' #MPL_Panel重要面板,可以继承或者创建实例 '''
    
        def __init__(self, parent):
            MPL_Panel_base.__init__(self, parent=parent)
    
            # 测试一下
            self.FirstPlot()
    
    
            # 仅仅用于测试和初始化,意义不大
    
        def FirstPlot(self):
            # self.rc('lines',lw=5,c='r')
            self.cla()
            x = np.arange(-5, 5, 0.25)
            y = np.sin(x)
            self.yticker(0.5, 0.1)
            self.xticker(1.0, 0.2)
            self.xlabel('X')
            self.ylabel('Y')
            self.title_MPL("图像")
            self.grid()
            self.plot(x, y, '--^g')
    
    
            ###############################################################################
    
    
    # MPL_Frame添加了MPL_Panel的1个实例
    ###############################################################################
    class MPL_Frame(wx.Frame):
        """MPL_Frame可以继承,并可修改,或者直接使用"""
    
        def __init__(self, title="MPL_Frame Example In wxPython", size=(800, 500)):
            wx.Frame.__init__(self, parent=None, title=title, size=size)
    
            self.MPL = MPL_Panel_base(self)
    
            # 创建FlexGridSizer
            self.FlexGridSizer = wx.FlexGridSizer(rows=9, cols=1, vgap=5, hgap=5)
            self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)
    
            self.RightPanel = wx.Panel(self, -1)
    
            # 测试按钮1
            self.Button1 = wx.Button(self.RightPanel, -1, "刷新", size=(100, 40), pos=(10, 10))
            self.Button1.Bind(wx.EVT_BUTTON, self.Button1Event)
    
            # 测试按钮2
            self.Button2 = wx.Button(self.RightPanel, -1, "关于", size=(100, 40), pos=(10, 10))
            self.Button2.Bind(wx.EVT_BUTTON, self.Button2Event)
    
            # 加入Sizer中
            self.FlexGridSizer.Add(self.Button1, proportion=0, border=5, flag=wx.ALL | wx.EXPAND)
            self.FlexGridSizer.Add(self.Button2, proportion=0, border=5, flag=wx.ALL | wx.EXPAND)
    
            self.RightPanel.SetSizer(self.FlexGridSizer)
    
            self.BoxSizer = wx.BoxSizer(wx.HORIZONTAL)
            self.BoxSizer.Add(self.MPL, proportion=-10, border=2, flag=wx.ALL | wx.EXPAND)
            self.BoxSizer.Add(self.RightPanel, proportion=0, border=2, flag=wx.ALL | wx.EXPAND)
    
            self.SetSizer(self.BoxSizer)
    
            # 状态栏
            self.StatusBar()
    
            # MPL_Frame界面居中显示
            self.Centre(wx.BOTH)
    
    
    
            # 按钮事件,用于测试
    
        def Button1Event(self, event):
            self.MPL.cla()  # 必须清理图形,才能显示下一幅图
            x = np.arange(-10, 10, 0.25)
            y = np.cos(x)
            self.MPL.plot(x, y, '--*g')
            self.MPL.xticker(2.0, 0.5)
            self.MPL.yticker(0.5, 0.1)
            self.MPL.title_MPL("MPL1")
            self.MPL.ShowHelpString("You Can Show MPL Helpful String Here !")
            self.MPL.grid()
            self.MPL.UpdatePlot()  # 必须刷新才能显示
    
        def Button2Event(self, event):
            self.AboutDialog()
    
    
            # 打开文件,用于测试
    
            def DoOpenFile(self):
                wildcard = r"Data files (*.dat)|*.dat|Text files (*.txt)|*.txt|ALL Files (*.*)|*.*"
                open_dlg = wx.FileDialog(self, message='Choose a file', wildcard=wildcard, style='')
                if open_dlg.ShowModal() == wx.ID_OK:
                    path = open_dlg.GetPath()
                    try:
                        file = open(path, 'r')
                        text = file.read()
                        file.close()
                    except:
                        dlg = wx.MessageDialog(self, 'Error opening file\n')
                        dlg.ShowModal()
    
                open_dlg.Destroy()
    
    
    
            # 自动创建状态栏
    
        def StatusBar(self):
            self.statusbar = self.CreateStatusBar()
            self.statusbar.SetFieldsCount(3)
            self.statusbar.SetStatusWidths([-2, -2, -1])
    
    
            # About对话框
    
        def AboutDialog(self):
            dlg = wx.MessageDialog(self,
                                   '\twxMatPlotLib\t\nMPL_Panel_base,MPL_Panel,MPL_Frame and MPL2_Frame \n Created by Wu Xuping\n Version 1.0.0 \n 2012-02-01',
                                   'About MPL_Frame and MPL_Panel', wx.OK | wx.ICON_INFORMATION)
            dlg.ShowModal()
            dlg.Destroy()
    
            ###############################################################################
    
    
    ###  MPL2_Frame添加了MPL_Panel的两个实例
    ###############################################################################
    class MPL2_Frame(wx.Frame):
        """MPL2_Frame可以继承,并可修改,或者直接使用"""
    
        def __init__(self, title="MPL2_Frame Example In wxPython", size=(850, 500)):
            wx.Frame.__init__(self, parent=None, title=title, size=size)
    
            self.BoxSizer = wx.BoxSizer(wx.HORIZONTAL)
    
            self.MPL1 = MPL_Panel_base(self)
            self.BoxSizer.Add(self.MPL1, proportion=-1, border=2, flag=wx.ALL | wx.EXPAND)
    
            self.MPL2 = MPL_Panel_base(self)
            self.BoxSizer.Add(self.MPL2, proportion=-1, border=2, flag=wx.ALL | wx.EXPAND)
    
            self.RightPanel = wx.Panel(self, -1)
            self.BoxSizer.Add(self.RightPanel, proportion=0, border=2, flag=wx.ALL | wx.EXPAND)
    
            self.SetSizer(self.BoxSizer)
    
            # 创建FlexGridSizer
            self.FlexGridSizer = wx.FlexGridSizer(rows=9, cols=1, vgap=5, hgap=5)
            self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)
    
            # 测试按钮1
            self.Button1 = wx.Button(self.RightPanel, -1, "TestButton", size=(100, 40), pos=(10, 10))
            self.Button1.Bind(wx.EVT_BUTTON, self.Button1Event)
    
            # 测试按钮2
            self.Button2 = wx.Button(self.RightPanel, -1, "AboutButton", size=(100, 40), pos=(10, 10))
            self.Button2.Bind(wx.EVT_BUTTON, self.Button2Event)
    
            # 加入Sizer中
            self.FlexGridSizer.Add(self.Button1, proportion=0, border=5, flag=wx.ALL | wx.EXPAND)
            self.FlexGridSizer.Add(self.Button2, proportion=0, border=5, flag=wx.ALL | wx.EXPAND)
    
            self.RightPanel.SetSizer(self.FlexGridSizer)
    
            # 状态栏
            self.StatusBar()
    
            # MPL2_Frame界面居中显示
            self.Centre(wx.BOTH)
    
    
    
            # 按钮事件,用于测试
    
        def Button1Event(self, event):
            self.MPL1.cla()  # 必须清理图形,才能显示下一幅图
            x = np.arange(-5, 5, 0.2)
            y = np.cos(x)
            self.MPL1.plot(x, y, '--*g')
            self.MPL1.xticker(2.0, 1.0)
            self.MPL1.yticker(0.5, 0.1)
            self.MPL1.title_MPL("MPL1")
            self.MPL1.ShowHelpString("You Can Show MPL1 Helpful String Here !")
            self.MPL1.grid()
            self.MPL1.UpdatePlot()  # 必须刷新才能显示
    
            self.MPL2.cla()
            self.MPL2.plot(x, np.sin(x), ':^b')
            self.MPL2.xticker(1.0, 0.5)
            self.MPL2.yticker(0.2, 0.1)
            self.MPL2.title_MPL("MPL2")
            self.MPL2.grid()
            self.MPL2.UpdatePlot()
    
        def Button2Event(self, event):
            self.AboutDialog()
    
    
    
            # 自动创建状态栏
    
        def StatusBar(self):
            self.statusbar = self.CreateStatusBar()
            self.statusbar.SetFieldsCount(3)
            self.statusbar.SetStatusWidths([-2, -2, -1])
    
    
            # About对话框
    
        def AboutDialog(self):
            dlg = wx.MessageDialog(self,
                                   '\twxMatPlotLib\t\nMPL_Panel_base,MPL_Panel,MPL_Frame and MPL2_Frame \n Created by Wu Xuping\n Version 1.0.0 \n 2012-02-01',
                                   'About MPL_Frame and MPL_Panel', wx.OK | wx.ICON_INFORMATION)
            dlg.ShowModal()
            dlg.Destroy()
    
    
    
    
            ########################################################################
    
    
    # 主程序测试
    if __name__ == '__main__':
        app = wx.App()
        frame = MPL2_Frame()
        #frame = MPL_Frame()
        frame.Center()
        frame.Show()
        app.MainLoop()
    

    2.将Matplotlib嵌入Pyqt5的GUI界面

    import sys
    from PyQt5 import QtWidgets
    
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
    import matplotlib.pyplot as plt
    
    import random
    
    class Window(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
    
            # a figure instance to plot on
            self.figure = plt.figure()
    
            # this is the Canvas Widget that displays the `figure`
            # it takes the `figure` instance as a parameter to __init__
            self.canvas = FigureCanvas(self.figure)
    
            # this is the Navigation widget
            # it takes the Canvas widget and a parent
            self.toolbar = NavigationToolbar(self.canvas, self)
    
            # Just some button connected to `plot` method
            self.button = QtWidgets.QPushButton('Plot')
            self.button.clicked.connect(self.plot)
    
            # set the layout
            layout = QtWidgets.QVBoxLayout()
            layout.addWidget(self.toolbar)
            layout.addWidget(self.canvas)
            layout.addWidget(self.button)
            self.setLayout(layout)
    
        def plot(self):
            ''' plot some random stuff '''
            # random data
            data = [random.random() for i in range(20)]
    
            # create an axis
            ax = self.figure.add_subplot(111)
    
            # discards the old graph
            ax.hold(False)
    
            # plot data
            ax.plot(data, '*-')
    
            # refresh canvas
            self.canvas.draw()
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
    
        main = Window()
        main.show()
    
        sys.exit(app.exec_())

     

    展开全文
  • 『Python』matplotlib实现GUI效果

    千次阅读 2020-05-18 10:04:00
    Python中绘图库matplotlib系列学习笔记(八)

    1. 类RadioButtons的使用方法

    类似单选框

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from matplotlib.widgets import RadioButtons
    mpl.use("Qt5Agg")
    
    x = np.linspace(0.0, 2.0, 1000)
    y1 = 1.5 * np.cos(2 * np.pi * x)
    y2 = 1.0 * np.cos(2 * np.pi * x)
    y3 = 0.8 * np.cos(2 * np.pi * x)
    
    fig, ax = plt.subplots(1, 1)
    line, = ax.plot(x, y1, color="red", lw=2)
    plt.subplots_adjust(left=0.35)
    
    facecolor = "cornflowerblue"
    
    ax1 = plt.axes([0.1, 0.7, 0.15, 0.15], facecolor=facecolor)
    radio1 = RadioButtons(ax1, ("1.5A", "1.0A", "0.8A"))
    
    
    def amplitudefunc(label):
        hzdict = {"1.5A": y1, "1.0A": y2, "0.8A": y3}
        ydata = hzdict[label]
        line.set_ydata(ydata)
        plt.draw()
    
    
    radio1.on_clicked(amplitudefunc)
    
    ax2 = plt.axes([0.1, 0.4, 0.15, 0.15], facecolor=facecolor)
    radio2 = RadioButtons(ax2, ("red", "green", "orange"))
    
    
    def colorfunc(label):
        line.set_color(label)
        plt.draw()
    
    
    radio2.on_clicked(colorfunc)
    
    ax3 = plt.axes([0.1, 0.1, 0.15, 0.15], facecolor=facecolor)
    radio3 = RadioButtons(ax3, ("-", "--", "-.", ":"))
    
    
    def linestylefunc(label):
        line.set_linestyle(label)
        plt.draw()
    
    
    radio3.on_clicked(linestylefunc)
    
    plt.show()

    2. 类Cursor的使用方法

    帮你聚焦鼠标所在位置

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from matplotlib.widgets import Cursor
    
    lineprops = dict(color="red", lw=2)
    
    fig, ax = plt.subplots(1, 1, subplot_kw=dict(facecolor="lemonchiffon"))
    
    x = np.random.random(100)
    y = np.random.random(100)
    ax.scatter(x, y, marker="o")
    ax.set_xlim(-0.02, 1.02)
    ax.set_ylim(-0.02, 1.02)
    
    cursor = Cursor(ax, useblit=True, **lineprops)  # 必须接收,不然会自动销毁掉。。。
    
    plt.show()

    3. 类CheckButtons的使用方法

    类似复选框

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from matplotlib.widgets import CheckButtons
    
    x = np.linspace(0.0, 2.0, 1000)
    y1 = 1.5 * np.cos(2 * np.pi * x)
    y2 = 1.0 * np.cos(2 * np.pi * x)
    y3 = 0.8 * np.cos(2 * np.pi * x)
    
    fig, ax = plt.subplots(1, 1)
    line1, = ax.plot(x, y1, color="red", lw=2, visible=False, label="1.2 A")
    line2, = ax.plot(x, y2, color="green", lw=2, visible=False, label="1.0 A")
    line3, = ax.plot(x, y3, color="orange", lw=2, visible=False, label="0.8 A")
    plt.subplots_adjust(left=0.30)
    
    facecolor = "cornflowerblue"
    
    cax = plt.axes([0.1, 0.4, 0.1, 0.15], facecolor=facecolor)
    
    lines = [line1, line2, line3]
    
    labels = [str(line.get_label()) for line in lines]
    visibility = [line.get_visible() for line in lines]
    check = CheckButtons(cax, labels, visibility)
    
    
    def func(label):
        index = labels.index(label)
        lines[index].set_visible(not lines[index].get_visible())
        plt.draw()
    
    
    check.on_clicked(func)
    
    plt.show()

    展开全文
  • 点击designer启动界面设置,文件保存在工作目录, 点击pyuic,自动将ui转化为ui.py, 另外建一个处理业务逻辑的py,信号/槽与ui文件定义的能对上就行,这样就实现了业务逻辑与ui的分离

    软件安装

    1. python安装
      -pyqt5模块安装
      pass
    2. pycharm安装
      -pass
    3. qt designer 安装
      -pass

    基本使用

    1. pycharm配置
      File –> Tool –> Settings –> External Tools
      增加一个qt designer,用于唤起qt designer
      这里写图片描述
      增加一个pyuic,用来将ui文件转化为py文件
      中间参数设置:-m PyQt5.uic.pyuic FileName F i l e N a m e -o FileNameWithoutExtension F i l e N a m e W i t h o u t E x t e n s i o n .py
      这里写图片描述
      使用的时候:
      点击designer启动界面设置,文件保存在工作目录,
      点击pyuic,自动将ui转化为ui.py,
      另外建一个处理业务逻辑的py,信号/槽与ui文件定义的能对上就行,这样就实现了业务逻辑与ui的分离
      这里写图片描述
    展开全文
  • 我们再用Jupyter-notebook,ipython-console,qtconsole的时候,有的时候画图希望不弹出窗口,直接画在console里,又得时候有希望弹出窗口,因为console里太小了 ...然后画图就可以显示在GUI里 以上这篇Pytho
  • GUI程序中的Matplotlib绘图

    千次阅读 2019-10-16 15:17:38
    一般的书上介绍Matplotlib的绘图功能都主要是介绍matplotlib.pyplot模块中的指令式绘图功能,因为这种方式与MATLAB很相似,使用过MATLAB的人转而使用Matplotlib绘图会比较容易上手。但是这种方式将绘图的效果都固定...

    1.示例程序和运行效果

    一般的书上介绍Matplotlib的绘图功能都主要是介绍matplotlib.pyplot模块中的指令式绘图功能,因为这种方式与MATLAB很相似,使用过MATLAB的人转而使用Matplotlib绘图会比较容易上手。但是这种方式将绘图的效果都固定在程序里了,例如曲线的颜色、线条类型等,如果要修改就需要修改源程序重新运行,所以这种方式只适合做研究时的快速数据可视化,不能做成GUI应用程序进行交互式绘图。

    Matplotlib是完全采用面向对象方法设计的,图的各个组成元素,如图、子图、坐标轴、曲线等都有相应的类,还有各种涉及图的操作的类。通过类的接口函数和属性可以对图的各个组成元素进行完全的控制,这种方法称为面向对象(Object-Oriented,OO)方法。面向对象方法适合在GUI应用程序中使用,因为在程序中可以对这些对象实例进行操作。

    下面先用一个简单的程序演示在GUI应用程序中使用Matplotlib的面向对象方法绘图的基本方法。示例Demo14_1目录下的文件Demo14_1GUI.py的完整代码如下:

    1. ## 程序文件: Demo14_1GUI.py
    2. ## 使用matplotlib 面向对象方法在GUI中绘图
    3. import sys
    4. import numpy as np
    5. import matplotlib as mpl
    6. from matplotlib.backends.backend_qt5agg import (FigureCanvas,
    7. NavigationToolbar2QT as NavigationToolbar)
    8. from PyQt5.QtWidgets import QApplication, QMainWindow
    9. from PyQt5.QtCore import Qt
    10.  
    11. class QmyMainWindow(QMainWindow):
    12. def __init__(self, parent=None):
    13. super().__init__(parent) #调用父类构造函数
    14. self.setWindowTitle("Demo14_1, GUI中的matplotlib绘图")
    15. ## rcParams[]参数设置,以正确显示汉字
    16. mpl.rcParams['font.sans-serif']=['KaiTi','SimHei'] #汉字字体
    17. mpl.rcParams['font.size']=12 #字体大小
    18. mpl.rcParams['axes.unicode_minus'] =False #正常显示负号
    19. self.__iniFigure() #创建绘图系统,初始化窗口
    20. self.__drawFigure() #绘图
    21.  
    22. ##==========自定义函数=================
    23. def __iniFigure(self): ##创建绘图系统,初始化窗口
    24. self.__fig=mpl.figure.Figure(figsize=(8, 5)) #单位英寸
    25. self.__fig.suptitle("plot in GUI application") #总的图标题
    26. figCanvas = FigureCanvas(self.__fig) #创建FigureCanvas对象
    27. naviToolbar=NavigationToolbar(figCanvas, self) #创建工具栏
    28. naviToolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
    29. self.addToolBar(naviToolbar) #添加工具栏到主窗口
    30. self.setCentralWidget(figCanvas)
    31.  
    32. def __drawFigure(self): ##绘图
    33. t = np.linspace(0, 10, 40)
    34. y1=np.sin(t)
    35. y2=np.cos(2*t)
    36.  
    37. ax1=self.__fig.add_subplot(1,2,1) #matplotlib.axes.Axes 类
    38. ax1.plot(t,y1,'r-o',label="sin", linewidth=1, markersize=5)
    39. ax1.plot(t,y2,'b:',label="cos",linewidth=2)
    40. ax1.set_xlabel('X 轴') #x轴标题
    41. ax1.set_ylabel('Y 轴',fontsize=14) #y轴标题
    42. ax1.set_xlim([0,10])
    43. ax1.set_ylim([-1.5,1.5])
    44. ax1.set_title("曲线") #子图标题
    45. ax1.legend() #自动创建图例
    46.  
    47. ax2=self.__fig.add_subplot(1,2,2) #matplotlib.axes.Axes 类
    48. week=["Mon","Tue","Wed","Thur","Fri","Sat","Sun"]
    49. sales=np.random.randint(200,400,7)
    50. ax2.bar(week,sales) #绘制柱状图
    51. ax2.set_xlabel('week days') #x轴标题
    52. ax2.set_ylabel('参观人数') #y轴标题
    53. ax2.set_title("柱状图") #子图标题
    54.  
    55. ## ============窗体测试程序 ================================
    56. if __name__ == "__main__":
    57. app = QApplication(sys.argv)
    58. form=QmyMainWindow()
    59. form.show()
    60. sys.exit(app.exec_())

    程序运行时的界面如图 14-2所示。注意这个程序是用PyQt5的GUI应用程序框架创建的。为了减少程序的复杂度,没有使用可视化方法设计UI窗体,而是采用纯代码的方式。程序中定义了一个基于QMainWindow的窗口类QmyMainWindow,界面构造和绘图都是在QmyMainWindow的构造函数中实现的。

     

    图14-2 使用Matplotlib绘图的PyQt5 GUI程序界面

    2.后端(backend)

    Matplotlib的绘图结果可以有各种输出形式,例如在Python交互式环境中输出绘图结果,嵌入到wxpython、pygtk、Qt等GUI框架中输出绘图结果,将绘图结果输出为图片文件,或在Web应用程序中输出绘图结果。要实现这些不同的输出,Matplotlib需要有不同的处理方法,这些不同的输出功能就称为后端(backend)。而相对的就是前端(frontend),是用户面对的代码。例如,对于一段相同的前端绘图代码,后端就是实现场景后面的工作以生成绘图输出。

    有两种后端,一种是用户界面后端(也称为交互式后端),例如用于wxpython、pygtk、tkinter、qt4、qt5、macosx的后端,另一种是用于生成图片文件的后端,如生成PNG、SVG、PDF等文件。

    对于用户界面后端,Matplotlib还将渲染器(renderer)和画布(canvas)分离开来,以实现更灵活的定制功能。Matplotlib使用的主要的渲染器是基于Anti-Grain Geometry C++库的Agg渲染器。除了macosx,所有的用户界面都使用Agg渲染器,因而有WXAgg、GTK3Agg、QT4Agg、QT5Agg、TkAgg等。有些用户界面也支持其他的渲染器,如Cairo渲染器,因而有GTK3Cairo、QT4Cairo、QT5Cairo等。

    在Matplotlib安装目录的“backends”子目录里是这些后端的模块文件,例如有backend_ gtk3agg.py、backend_gtk3cairo.py、backend_qt5agg.py、backend_qt5cairo.py等。本书只考虑QT5Agg渲染器,所以在程序的import部分有如下的语句:

     
    1. from matplotlib.backends.backend_qt5agg import (
    2. FigureCanvas, NavigationToolbar2QT as NavigationToolbar)

    这是从matplotlib.backends.backend_qt5agg模块中导入了FigureCanvas类和NavigationToolbar2QT类,并将NavigationToolbar2QT类重命名为NavigationToolbar。

    追踪查看FigureCanvas类的源程序,可以发现它的上层父类之一是QWidget,所以,它是用于在PyQt5 GUI界面上显示Matplotlib绘图结果的Widget组件。要在PyQt5 GUI窗体上显示Matplotlib绘图结果,必须创建一个FigureCanvas界面组件,就如同使用PyQtChart模块绘制图表时需要先创建一个QChartView界面组件。

    3.程序解读

    (1)为正常显示汉字的设置

    在自定义类QmyMainWindow的构造函数里实现窗体界面构造和Matplotlib绘图。

    首先对Matplotlib的全局设置做一些修改,以便正确显示汉字。可以修改全局字典变量matplotlib.rcParams里的参数,也可以修改配置文件matplotlibrc的内容。程序中的设置语句如下:

    1. mpl.rcParams['font.sans-serif']=['KaiTi','SimHei'] #汉字字体
    2. mpl.rcParams['font.size']=12 #字体大小
    3. mpl.rcParams['axes.unicode_minus'] =False #正常显示负号

    第1行语句是设置字体族(font family)“sans-serif”的参数,第3行语句是为了正常显示负号。

    Matplotlib中将字体分为5种字体族,分别是“serif”“sans-serif”“cursive”“fantasy”“monospace”,每一种字体族可以设定多种字体。在默认的matplotlibrc文件中使用的字体族是“sans-serif”,这个字体族的字体不包含汉字字体,所以无法正常显示汉字。

    第1行语句将’font.sans-serif’参数设置为[‘KaiTi’, ‘SimHei’],Matplotlib将优先使用字体’KaiTi’,如果找不到这个字体的字体文件,就使用后面的字体’SimHei’,可以为一个字体族设置多个字体。Windows系统中常见的汉字字体名称如下。

    • KaiTi =楷体;SimHei=黑体;FangSong=仿宋。
    • STSong=华文宋体;STFangsong=华文仿宋;STHeiti=华文黑体。

    关于字体的设置可以查看配置文件matplotlibrc的默认内容,在Matplotlib 3.0.0用户手册的第89页。

    (2)创建绘图界面组件的函数__iniFigure()

    构造函数里调用自定义函数__iniFigure()创建绘图相关的界面组件,此函数的完整代码见前面的程序清单。程序首先创建了一个matplotlib.figure.Figure类对象self.__fig:

    1. self.__fig=mpl.figure.Figure(figsize=(8, 5)) #单位英寸

    Figure类就是用于绘图的图表类,是Matplotlib中一个主要的类,它负责管理一个图形窗口中子图、各种图表组件的绘制,其功能类似于PyQtChart模块中的QChart类。但是一个Figure里可以绘制多个子图,而QChart只能绘制一个图表。

    创建FigureCanvas对象时必须传递一个Figure类对象,程序中是:

    1. figCanvas = FigureCanvas(self.__fig) #创建FigureCanvas对象

    这样,Figure类对象self.__fig就用figCanvas作为图形渲染区域(画布),self.__fig的各种绘图操作都在此画布上显示出来。

    创建NavigationToolbar类导航工具栏naviToolbar时传递一个FigureCanvas对象作为参数,即

    1. naviToolbar=NavigationToolbar(figCanvas, self) #创建工具栏

    这样创建的导航工具栏的操作就是针对关联的FigureCanvas类对象figCanvas。Navigation- Toolbar的父类是QToolBar,所以可以使用setToolButtonStyle()函数设置按钮显示方式,并且添加它作为主窗口的工具栏。

    程序运行时,图14-2中的工具栏与图14-1中的工具栏有些差异,例如图14-2的工具栏中有“Customize”按钮对子图进行设置,而图14-1的工具栏中没有这个按钮。两个工具栏的“Subplots”按钮弹出的对话框的界面也不同,这就是由于使用了不同的后端引起的。

    FigureCanvas的父类是QWidget,所以其对象示例可以作为主窗口的中心组件。Navigation- Toolbar和FigureCanvas还有其他的一些功能,在后面再具体介绍。

    (3)实现绘图功能的函数__drawFigure()

    构造函数里调用自定义函数__drawFigure()绘图,其完整代码参见前面的代码清单。

    函数__drawFigure()实现的绘图功能与程序Demo14_1Script.py中的几乎相同,但是实现的方法不同。在文件Demo14_1GUI.py的import部分没有导入matplotlib.pyplot,它完全使用面向对象的方法绘图。

    在使用NumPy的功能准备好数据后,程序首先创建了一个子图,代码是:

    1. ax1=self.__fig.add_subplot(1,2,1) #子图1

    self.__fig是matplotlib.figure.Figure类对象,是整个图。使用Figure.add_subplot()函数创建了一个对象ax1。函数Figure.add_subplot()与matplotlib.pyplot.subplot()参数格式和功能完全相同,这里不再对参数做详细的说明,读者可以通过内建函数help()获取该函数的详细帮助信息,输入指令是:

    1. >>> from matplotlib.figure import Figure
    2. >>> help (Figure.add_subplot)

    这里创建的对象ax1是matplotlib.figure.Axes类型,它是管理一个子图区域绘图的类。通过Axes类的接口函数在子图区域画图,例如ax1使用plot()函数绘制了两条曲线,Axes.plot()函数的使用方法与matplotlib.pyplot.plot()函数相同。

    Axes类通过属性和接口函数对子图的各个组成元素,如曲线、坐标轴范围、标题、网格线、图例等进行操作。一般通过一组set_和get_函数对一个属性进行设置和获取,例如Axes.set_xlim()函数设置x轴坐标范围,Axes.get_xlim()函数返回x轴的坐标范围。这与matplotlib.pyplot模块中的操作方法不同,pyplot.xlim()函数既可以设置x轴坐标范围,也可以返回x轴坐标范围。

    Axes类是Matplotlib绘图中最主要的一个类,一个子图上的所有元素都由Axes管理,所以在GUI中进行Matplotlib绘图主要就是Axes类及其管理的各个子对象的操作,如坐标轴(Axis类)、曲线(Line2D类)、文本(Text类)、图例(Legend类)的操作。这些操作都使用面向对象的方法,与matplotlib.pyplot中的指令式操作的方法不同,但实现的功能相同。

    本节先通过一个简单示例演示了在GUI程序中使用Matplotlib绘图的基本方法,下一节再对Matplotlib绘图时常用到的各个类的使用方法进行详细介绍。

    本文截选自《Python Qt GUI与数据可视化编程》
    王维波,栗宝鹃,张晓东 著

     

    • PyQt5教程书籍,pyqt5快速开发实例教程
    • PythonQt5GUI快速编程
    • 示例丰富的PythonGUI编程和数据可视化编程的实用指南

    本书介绍在Python中使用PyQt5和其他模块进行GUI和数据可视化编程的方法。第一部分介绍PyQt5设计GUI程序的基本框架,包括GUI应用程序的基本结构、窗体UI可视化设计与窗体业务逻辑的设计、信号与槽的特点和使用等。第二部分介绍GUI程序设计中一些主要功能模块的使用,包括基本界面组件、事件处理、数据库、绘图、多媒体等。第三部分先介绍使用PyQtChart和PyQtDataVisualization进行二维和三维数据可视化设计的方法,再介绍将Matplotlib嵌入PyQt5 GUI应用程序窗口界面中进行数据可视化的编程方法。通过研读本书,读者可以掌握使用PyQt5、PyQtChart、Matplotlib等模块进行GUI应用程序和数据可视化设计的方法。

    本书适合具有Python编程基础,并想通过Python设计GUI应用程序或在GUI应用程序中实现数据可视化的读者阅读和参考。

    展开全文
  • import matplotlib matplotlib.use("Agg") 具体可以参考(levy_cui)的博客。
  • 这两天用pyqt建了个gui,将自己的数据呈现通过matplotlib呈现在gui中,便于后续实现更多交互。简单的事情折腾了挺久的。 总结这个过程逻辑如下: 几个花时间比较长的地方,记录如下: 1、建UI时使用layout管理...
  • 在PyQt5设计的GUI界面中显示matplotlib绘制的图形

    万次阅读 多人点赞 2018-05-03 17:34:18
    一、matplotlib如何嵌入PyQt5中? 通过matplotlib.backends.backend_qt5agg类连接PyQt5。在实际代码中,我们需要在引用部分加入内容: import matplotlib matplotlib.use("Qt5Agg") # 声明使用QT5 from ...
  • 在无GUI的 shell 上画图 直接画图会报错 qt.qpa.screen: QXcbConnection: Could not connect to display localhost:11.0 Could not connect to any X display. 只需要加入下面这行代码: plt.switch_backend("agg")...
  • Pyqt5 + matplotlib 的在 GUI中 图片呈现

    千次阅读 2019-04-30 19:53:10
    Pyqt5 + matplotlib 的在 GUI中 图片呈现 个人原创,未经允许,不可转载!!! 1. 在QtDesigner中设计UI界面 层次如下:From----->Widget------>GroupBox 2. 转成.py文件 # -*- coding: utf-8 -*- ...
  • Matplotlib嵌入wxPython的GUI界面

    千次阅读 2017-11-19 20:49:22
    Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。有时候,我们想把matplotlib嵌入到wxpython,这样再利用pyinstaller打包便可形成一个脱离python编译器独立...
  • PyQt+matplotlib界面简单实现

    万次阅读 2014-11-22 20:53:25
    简单来说三个文件,第一个,定义程序界面,第二个,定义插入的matplotlib的功能,也就是要显示什么东西 第三个,就是把两个连接起来,也就是pyqt特有的信号-槽,把按键发射的信号跟你要实现的功能连接 其中...
  • ..._tkinter.TclError: no display name and no $DISPLAY environment variable两种解决方法:1、python文件中:在 from matplotlib import pylot 之前,添加代码:如下:import matplotlib as mpl mpl.use('Agg')...
  • 我们再用Jupyter-notebook,ipython-console,qtconsole的时候,有的时候画图希望不弹出窗口,直接画在...%matplotlib inline 然后在控制台里画图就可以显示在控制台里 %matplotlib qt5 #备选参数: ['aut
  • 需要在C#中绘制图表,图表还是可以拖动,放大缩小的那种,python的matplotlib包含了这些功能,所以想将matplotlib嵌入到C#的GUI中,我是C#新手,这是老师给的任务,求C#大佬们帮忙。 下图是matplotlib绘制图表的示例...
  • 使用Python的tkinter和matplotlib模块在GUI界面中绘制PID交互曲线,用以观察各参数对PID控制的影响 最近学PID控制,想要直观的观察PID各部分参数对PID控制的影响,就用Python写了一个界面,如下: pid_GUI.py #!/...
  • 之前文章(CSDN)中,使用第2种方法创建Python的Matplotlib多y轴(2个及以上)绘图嵌入PyQt5界面GUI),发现多次计算后,旧图依然存在问题。 绘图过程如下: 1)对画布fig增加一个axe主子图,用于画一条曲线,...
  • 有时想在wxPython中使用Matplotlib,而不是使用命令行的格式调用,以下给出一个简单的实现的代码,更高级的可以google一下wxMPL或者wxmplot.# -*- coding: utf-8 -*-import wximport numpy as npimport matplotlib# ...
  • 一、pyqt5的UI中嵌入matplotlib的方法 1、导入模块 导入模块比较简单,首先声明使用pyqt5,通过FigureCanvasQTAgg创建画布,可以将画布的图像显示到UI,相当于pyqt5的一个控件,后面的绘图就建立在这个画布上,...
  • 在运行TensorFlow.Object_Detection时遇到问题:UserWarning: Matplotlib is currently using agg, which is a non-GUI backend. 检测物体最终生成的图片无法在终端显示 解决办法 编辑tensorflow所在目录下的 models...
  • matplotlib non-GUI backend 无法显示图片解决办法问题分析新的问题 问题分析 根据提示,表明现在的显示方式,是非GUI图形界面显示的。所以在调用pylab.show()的时候会有这样的一个提示。那么,既然有非GUI的显示...
  • matplotlib.use("Qt5Agg") #声明 matplotlib 使用的是Qt5的库 from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget from matplotlib.backends....
  • 使用的编程语言是python3.4, 界面设计软件是erics 6结合PyQt5 1、使用QT Designer实现UI 界面 在eric 6 中,点击项目,新建一个项目,增加如下图的一些控件与布局,不相同都可以。 除了 QVBoxLayout 垂直布局...
  • 介绍图形用户界面GUI)是为用户交互提供灵活性的界面。它的交互性使我着迷。应用程序越吸引人,游戏开发就越好。GUI的最常见组件是主窗口,按钮,文本输入,标签,菜单等。在Python中进行...
  • 我正在使用PyQt5,试图为我的数据分析工具生成一个GUI。我的问题是,我不知道如何嵌入一个具有完整功能的matplotlib绘图。关于PyQt5和如何嵌入matplotlib的所有教程都展示了一种非常简单的方法,即直接在代码中创建...
  • 可用的GUI窗口matplotlib

    2018-01-19 21:21:00
     下面是一个可用的使用tkinter包裹的matplotlib界面,提供了简单的matplotlib功能演示,主题切换,注释部分还有matplotlib对事件监听的代码 #!/usr/bin/env python # coding:utf-8 """ 可用的GUI窗口matplotlib ""...
  • 我编写了以下脚本,该脚本创建了一个空GUI,其中包含一个调用Matplotlib图表的按钮:import sysimport osfrom PyQt4 import QtGuifrom PyQt4 import *import matplotlib.pyplot as pltclass SmallGUI(QtGui....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,204
精华内容 2,081
关键字:

matplotlib界面gui