将matplotlib绘图嵌入pyqt的方法示例
我的终极整理,供参考
#coding:utf-8 importmatplotlib #使用matplotlib中的FigureCanvas(在使用Qt5Backends中FigureCanvas继承自QtWidgets.QWidget) frommatplotlib.backends.backend_qt5aggimportFigureCanvasQTAggasFigureCanvas fromPyQt5importQtCore,QtWidgets,QtGui fromPyQt5.QtWidgetsimportQDialog,QPushButton,QVBoxLayout importmatplotlib.pyplotasplt importnumpyasnp importsys """学好pyplotAPI和面向对象API搞定matplotlib绘图显示在GUI界面上""" classMain_window(QDialog): def__init__(self): super().__init__() #三步走,定Figure,定Axes,定FigureCanvas #1直接一段代码搞定figure和axes self.figure,(self.ax1,self.ax2)=plt.subplots(figsize=(13,3),ncols=2) #2先创建figure再创建axes #2.1用plt.figure()/Figure()创建figure,推荐前者 self.figure=plt.figure(figsize=(5,3),facecolor='#FFD7C4') #self.figure=Figure(figsize=(5,3),facecolor='#FFD7C4') #2.2用plt.subplots()/plt.add_subplot()创建axes,推荐前者 (self.ax1,self.ax2)=self.figure.subplots(1,2) #ax1=self.figure.add_subplot(121) #ax2=self.figure.add_subplot(122) #3绑定figure到canvas上 self.canvas=FigureCanvas(self.figure) self.button_draw=QPushButton("绘图") self.button_draw.clicked.connect(self.Draw) #设置布局 layout=QVBoxLayout() layout.addWidget(self.canvas) layout.addWidget(self.button_draw) self.setLayout(layout) defDraw(self): AgeList=['10','21','12','14','25'] NameList=['Tom','Jon','Alice','Mike','Mary'] #将AgeList中的数据转化为int类型 AgeList=list(map(int,AgeList)) #将x,y转化为numpy数据类型,对于matplotlib很重要 self.x=np.arange(len(NameList))+1 self.y=np.array(AgeList) #tick_label后边跟x轴上的值,(可选选项:color后面跟柱型的颜色,width后边跟柱体的宽度) self.ax1.bar(range(len(NameList)),AgeList,tick_label=NameList,color='green',width=0.5) fora,binzip(self.x,self.y): self.ax1.text(a-1,b,'%d'%b,ha='center',va='bottom') plt.title("Demo") pos=self.ax2.imshow(np.random.random((100,100)),cmap=plt.cm.BuPu_r) self.figure.colorbar(pos,ax=self.ax2)#终于可以用colorbar了 self.canvas.draw() #运行程序 if__name__=='__main__': app=QtWidgets.QApplication(sys.argv) main_window=Main_window() main_window.show() app.exec()
总结就是,想要在特定的位置放matplotlib绘图还是要用面向对象的API,但混合使用pyplot的API可以使代码更简单。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。