将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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。