@ 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:
Libros de referencia: Python Qt GUI y programación de visualización de datos