PyQt5 toma notas y usa Matplotlib para dibujar

@ PyQt5 Toma notas y usa Matplotlib para dibujar

El proceso básico de creación de gráficos Matplotlib en PyQt5

1. Para mostrar en la interfaz PyQt5, primero cree el componente de interfaz FigureCanvas, un lienzo (equivalente al componente Widget utilizado para mostrar Matplotlib);
2. Luego, debe crear una clase de gráfico de componentes relacionados con el dibujo, que representa la imagen completa en el lienzo, y administra El dibujo de subgrafos y varios componentes del gráfico en la ventana gráfica;
3. Luego, cree una clase de subgrafo Axes para dibujar subgrafos. Puede haber varios subgrafos en una Figura, y todos los elementos en un subgrafo son administrados por Axes, incluidos los ejes de coordenadas. Clase (Eje), clase de curva (Line2D), clase de texto (Texto), clase de leyenda, etc. (Leyenda). Cuando se crea un objeto Axes, el eje xy el eje y se crearán automáticamente al mismo tiempo para operar en cada subobjeto en el subgráfico.
Por ejemplo:
axes = self.MainUI.widget.figure.add_subplot (1,1,1) #Crear una subtrama en la interfaz de usuario creada
axes.set_xlim (0,9)
# rango del eje x axes.set_xlabel ("distancia [ m] ”) # etiqueta horizontal
axes.grid (b = True, which = 'major', axis = 'both') grid
t = []
s = []
for i in range (10):
t.append ( i)
s.append (random.randint (0,1500))
axes.plot (t, s, picker = True) # 画
线 图 axes.cla () # Borrar el contenido del
subgrafo self.MainUI.widget.redraw () # subgrafo después de completar realizar varias operaciones y actualizar
# self.figure.canvas.draw () Para
interfaces e instrucciones específicas, consulte: instrucciones de la interfaz matplotlib.axes

Función interactiva

Barra de herramientas NavigationToolbar

Al crear la barra de herramientas NavigationToolbar, pase un objeto FigureCanvas como parámetro para asociar el objeto de clase FigureCanvas.
naviBar = NavigationToolbar (figCanvas, self) #Create Toolbar La
clase principal de NavigationToolbar es QToolbar Puede usar algunas funciones de la interfaz de QToolbar para transformar la barra de herramientas.

Eventos proporcionados por FigureCanvas

Nombre del evento Acción de disparo
button_press_event Botón del mouse hacia abajo
button_release_event Liberación del botón del mouse
motion_notify_event Movimiento del raton
scroll_event Acción de la rueda del mouse
key_press_event Pulsación de tecla del teclado
key_release_event Liberación de la tecla del teclado
pick_event Objeto recogido
figure_enter_event Colocar el mouse en un objeto Figura
figure_leave_event El ratón deja un objeto Figura
axes_enter_event Colocar el mouse en una subimagen
axes_leave_event El mouse dejó un subgrafo

Los eventos generados por las operaciones del mouse y del teclado tienen los siguientes atributos:
x, y: la posición de x, y en el lienzo, unidad de píxel;
inaxes: el objeto de subimagen Axes que generó el evento del mouse;
xdata, ydata: las coordenadas x, y del cursor del mouse valor

En la clase FigureCanvas, hay dos funciones para crear y disociar eventos y funciones de ranura:
1. Asociar eventos con funciones de ranura mpl_connect (eventName, function), eventName es una cadena, que es el nombre del evento anterior, y la función es La función de tragamonedas conectada devuelve un número para marcar este evento:
self .__ cid = figCanvas.mpl_connect ("scroll_event", self.do_scrollZoom) #Soporta el zoom de la rueda del mouse
2, disociar evento mpl_disconnect (self .__ cid)

Personalizar una clase QmyFigureCanvas

El siguiente código personaliza una clase QmyFigureCanvas, heredada de la clase QWidget, como un componente de dibujo, es decir, cuando se diseña la interfaz de Qt Designer, un componente QWidget se puede actualizar a QmyFigureCanvas.

from PyQt5.QtWidgets import QWidget
from PyQt5 import QtCore
from matplotlib.backends.backend_qt5agg import (FigureCanvasQTAgg as FigureCanvas,NavigationToolbar2QT as NavigationToolbar)#用户界面后端渲染,用来以绘图的形式输出
from PyQt5.QtWidgets import QVBoxLayout
from matplotlib.figure import Figure#图表类
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy

class QmyFigureCanvas(QWidget):
    mouseMove = QtCore.pyqtSignal(numpy.float64,mpl.lines.Line2D)#自定义触发信号,用于与UI交互
    # mousePress = QtCore.pyqtSignal(numpy.float64,numpy.float64)
    # mouseRelease = QtCore.pyqtSignal(numpy.float64,numpy.float64)
    def __init__(self,parent=None,toolbarVisible=True,showHint=False):
        super().__init__(parent)
        # self.figure = mpl.figure.Figure()#公共属性figure
        self.figure = Figure()#公共属性figur
        figCanvas = FigureCanvas(self.figure)#创建FigureCanvas对象
        self.naviBar = NavigationToolbar(figCanvas,self)#创建工具栏
        
        actList = self.naviBar.actions()
        count = len(actList)
        self.__lastActtionHint = actList[count-1]
        self.__showHint = showHint#是否显示坐标提示
        self.__lastActtionHint.setVisible(self.__showHint)
        self.__showToolbar = toolbarVisible#是否显示工具栏
        self.naviBar.setVisible(self.__showToolbar)

        layout = QVBoxLayout(self)
        layout.addWidget(self.naviBar)#添加工具栏
        layout.addWidget(figCanvas)#添加FigureCanvas对象
        layout.setContentsMargins(0,0,0,0)
        layout.setSpacing(0)

        self.__cid = figCanvas.mpl_connect("scroll_event",self.do_scrollZoom)#支持鼠标滚轮缩放
        self.__cid1 = figCanvas.mpl_connect("pick_event",self.do_series_pick)#支持曲线抓取
        # self.__cid2 = figCanvas.mpl_connect("button_press_event",self.do_pressMouse)#支持鼠标按下
        self.__cid3 = figCanvas.mpl_connect("button_release_event",self.do_releaseMouse)#支持鼠标释放
        self.__cid4 = figCanvas.mpl_connect("motion_notify_event",self.do_moveMouse)#支持鼠标移动
        self.mouseIsPress = False
        self.pickStatus = False

	#公共函数接口
    def setToolbarVisible(self,isVisible=True):#是否显示工具栏
        self.__showToolbar = isVisible
        self.naviBar.setVisible(isVisible)

    def setDataHintVisible(self,isVisible=True):#是否显示坐标提示
        self.__showHint = isVisible
        self.__lastActtionHint.setVisible(isVisible)

    def redraw(self):#重绘曲线,快速调用
        self.figure.canvas.draw()

    def do_scrollZoom(self,event):#通过鼠标滚轮缩放
        ax = event.inaxes    #产生事件axes对象
        if ax == None:
            return
        self.naviBar.push_current()
        xmin,xmax = ax.get_xbound()
        xlen = xmax - xmin
        ymin,ymax = ax.get_ybound()
        ylen = ymax - ymin

        xchg = event.step * xlen / 20
        xmin = xmin + xchg
        xmax = xmax - xchg
        ychg = event.step * ylen / 20
        ymin = ymin + ychg
        ymax = ymax - ychg
        ax.set_xbound(xmin,xmax)
        ax.set_ybound(ymin,ymax)
        event.canvas.draw()
        
	def do_series_pick(self,event):#picker事件获取抓取曲线
	        self.series = event.artist
	        # index = event.ind[0]
	        # print("series",event.ind)
	        if isinstance(self.series,mpl.lines.Line2D):
	             self.pickStatus = True
        
    def do_releaseMouse(self,event):#鼠标释放,释放抓取曲线
        if event.inaxes == None:
            return
        if self.pickStatus == True:
            self.series.set_color(color = "black")
            self.figure.canvas.draw()
            self.pickStatus = False
        # self.mouseRelease.emit(event.xdata,event.ydata)

    def do_moveMouse(self,event):#鼠标移动,重绘抓取曲线
        if event.inaxes == None:
            return
        if self.pickStatus == True:
            self.series.set_xdata([event.xdata,event.xdata])
            self.series.set_color(color = "red")
            self.figure.canvas.draw()
            self.mouseMove.emit(event.xdata,self.series)#自定义触发信号,用于与UI交互

La parte de código crea un componente de gráfico Figure () que contiene una barra de herramientas y personaliza el evento de zoom de la rueda del mouse, y cuando el mouse toma la línea, la línea se traduce dentro del rango de coordenadas.

Ejemplos de efectos de aplicación

Aplique QmyFigureCanvas personalizado a la interfaz de usuario, dibuje una curva aleatoriamente en la interfaz de usuario y agregue la línea axvline como la línea de marca. Puede arrastrar la línea de marca para mostrar otras operaciones, como se muestra en la figura:
Inserte la descripción de la imagen aquí

Libros de referencia: Python Qt GUI y programación de visualización de datos

Supongo que te gusta

Origin blog.csdn.net/Lhhxxdhr/article/details/108714777
Recomendado
Clasificación