def __createFigure(self): ## self.__fig=mpl.figure.Figure(figsize=(8, 5),constrained_layout=True, tight_layout=None) #单位英寸 ## self.__fig=mpl.figure.Figure(figsize=(8, 5)) #单位英寸 self.__fig=mpl.figure.Figure() figCanvas = FigureCanvas(self.__fig) #创建FigureCanvas对象,必须传递一个Figure对象 self.__fig.suptitle("suptitle:matplotlib in Qt GUI",fontsize=16, fontweight='bold') # 总的图标题 naviToolbar=NavigationToolbar(figCanvas, self) #创建NavigationToolbar工具栏 actList=naviToolbar.actions() #关联的Action列表 count=len(actList) #Action的个数 lastAction=actList[count-1] #最后一个Action labCurAxes=QLabel("当前子图") naviToolbar.insertWidget(lastAction,labCurAxes) self.__comboAxes=QComboBox(self) #子图列表,用于选择子图 self.__comboAxes.setToolTip("选择当前子图") self.__comboAxes.currentIndexChanged.connect(self.do_currentAxesChaned) naviToolbar.insertWidget(lastAction,self.__comboAxes) naviToolbar.insertAction(lastAction,self.ui.actQuit) #在最后一个Action之前插入一个Action ## naviToolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) #ToolButtonTextUnderIcon self.addToolBar(naviToolbar) #添加作为主窗口工具栏 splitter = QSplitter(self) splitter.setOrientation(Qt.Horizontal) splitter.addWidget(self.ui.toolBox) #左侧控制面板 splitter.addWidget(figCanvas) #右侧FigureCanvas对象 self.setCentralWidget(splitter)
class QmyFigureCanvas(QWidget): def __init__(self, parent=None, toolbarVisible=True, showHint=False): super().__init__(parent) self.figure = mpl.figure.Figure() #公共的figure属性 figCanvas = FigureCanvas(self.figure) #创建FigureCanvas对象,必须传递一个Figure对象 self.naviBar = NavigationToolbar(figCanvas, self) #公共属性naviBar self.__changeActionLanguage() #改为汉语 actList = self.naviBar.actions() #关联的Action列表 count = len(actList) #Action的个数 self.__lastActtionHint = actList[count - 1] #最后一个Action,坐标提示标签 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) ##=====公共接口函数 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 __changeActionLanguage(self): ##汉化工具栏 actList = self.naviBar.actions() #关联的Action列表 actList[0].setText("复位") #Home actList[0].setToolTip("复位到原始视图") #Reset original view actList[1].setText("回退") #Back actList[1].setToolTip("回退前一视图") #Back to previous view actList[2].setText("前进") #Forward actList[2].setToolTip("前进到下一视图") #Forward to next view actList[4].setText("平动") #Pan actList[4].setToolTip( "左键平移坐标轴,右键缩放坐标轴") #Pan axes with left mouse, zoom with right actList[5].setText("缩放") #Zoom actList[5].setToolTip("框选矩形框缩放") #Zoom to rectangle actList[6].setText("子图") #Subplots actList[6].setToolTip("设置子图") #Configure subplots actList[7].setText("定制") #Customize actList[7].setToolTip("定制图表参数") #Edit axis, curve and image parameters actList[9].setText("保存") #Save actList[9].setToolTip("保存图表") #Save the figure def do_scrollZoom(self, event): #通过鼠标滚轮缩放 ax = event.inaxes # 产生事件axes对象 if ax == None: return self.naviBar.push_current( ) #Push the current view limits and position onto the stack,这样才可以还原 xmin, xmax = ax.get_xbound() xlen = xmax - xmin ymin, ymax = ax.get_ybound() ylen = ymax - ymin xchg = event.step * xlen / 20 #step [scalar],positive = ’up’, negative ='down' 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()