Python利用Matplotlib和Tkinter在应用程序中内嵌图表
在日常应用程序开发中,图表(折线图,柱状图等)以其直观显示,清晰明了的优势,使得应用范围越来越广泛,本文以一个简单的小例子,简述如何将Tkinter和Matplotlib相互关联起来,在应用程序中嵌入图表,仅供学习分享使用,如有不足之处,还请指正。 涉及知识点
操作步骤如果要将matplotlib生成图表和Tkinter生成的GUI程序关联起来,需要以下3个步骤:
示例效果图将Matlotlib生成的曲线图,嵌入到普通的windows程序中,如下图所示: ? ?核心代码创建图表代码 1 def create_matplotlib(self): 2 """创建绘图对象""" 3 # 设置中文显示字体 4 mpl.rcParams['font.sans-serif'] = [SimHei'] 中文显示 5 mpl.rcParams[axes.unicode_minus'] = False 负号显示 6 创建绘图对象f figsize的单位是英寸 像素 = 英寸*分辨率 7 self.figure = plt.figure(num=2,figsize=(7,4),dpi=80,facecolor="gold",edgecolor=green',frameon=True) 8 创建一副子图 9 fig1 = plt.subplot(1,1,1) 三个参数,依次是:行,列,当前索引 10 创建数据源:x轴是等间距的一组数 11 x = np.arange(-2 * np.pi,2 * np.pi,0.1) 12 y1 = np.sin(x) 13 y2 = np.cos(x) 14 15 line1 = fig1.plot(x,y1,color=redy=sin(x)--') 画第一条线 16 line2 = fig1.plot(x,y2,1)">y=cos(x)'17 plt.setp(line2,linewidth=1,1)">- 华第二条线 color='', 18 19 fig1.set_title(数学曲线图centerxx-large 设置标题 20 line1.set_label("正弦曲线") # 确定图例 21 定义legend 重新定义了一次label 22 fig1.legend([正弦余弦'],1)">lower rightorange23 ,fontsize='xx-large' 24 fig1.set_xlabel((x)横坐标 确定坐标轴标题 25 fig1.set_ylabel((y)纵坐标"26 fig1.set_yticks([-1,-1 / 2,1 / 2,1]) 设置坐标轴刻度 27 fig1.grid(which=majorxgray 设置网格 创建图表容器,并显示代码 1 createWidget(self,figure): 创建组件 3 self.label = Label(self,text=这是一个Tkinter和Matplotlib相结合的小例子 4 self.label.pack() 5 创建画布 6 self.canvas = FigureCanvasTkAgg(figure,self) 7 self.canvas.draw() 8 self.canvas.get_tk_widget().pack(side=TOP,fill=BOTH,expand=1 9 把matplotlib绘制图形的导航工具栏显示到tkinter窗口上 toolbar = NavigationToolbar2Tk(self.canvas,self) 11 toolbar.update() 12 self.canvas._tkcanvas.pack(side=TOP,expand=1) 13 self.button = Button(master=self,text="退出",command=quit) 14 # 按钮放在下边 15 self.button.pack(side=BOTTOM) 整体代码及调用逻辑,如下所示: 1 from tkinter import * 2 import numpy as np 3 matplotlib matplotlib.pyplot as plt 5 from matplotlib.pylab mpl 6 from matplotlib.backends.backend_tkagg FigureCanvasTkAgg,NavigationToolbar2Tk 7 8 9 class Application(Frame): 10 一个经典的GUI写法11 12 def __init__(self,master=None): 13 '''初始化方法''' 14 super().__init__(master) 调用父类的初始化方法 15 self.master = master 16 self.pack(side=TOP,expand=1) 此处填充父窗体 17 self.create_matplotlib() 18 self.createWidget(self.figure) 19 20 21 22 self.label = Label(self,1)">23 24 25 self.canvas =26 27 self.canvas.get_tk_widget().pack(side=TOP,1)">28 29 30 31 32 33 34 self.button.pack(side=BOTTOM) 35 36 37 38 39 mpl.rcParams[40 mpl.rcParams[41 42 self.figure = plt.figure(num=2,1)">43 44 fig1 = plt.subplot(1,1)">45 46 x = np.arange(-2 * np.pi,1)">47 y1 =48 y2 =49 50 line1 = fig1.plot(x,1)">51 line2 = fig1.plot(x,1)">52 plt.setp(line2,1)">53 54 fig1.set_title(55 56 57 fig1.legend([58 59 fig1.set_xlabel(60 fig1.set_ylabel(61 fig1.set_yticks([-1,1)">62 fig1.grid(which= 设置网格 63 64 destroy(self): 65 重写destroy方法66 super().destroy() 67 quit() 68 69 quit(): 70 点击退出按钮时调用这个函数71 root.quit() 结束主循环 72 root.destroy() 销毁窗口 73 74 75 if __name__ == __main__: 76 root = Tk() 77 root.title(数学曲线窗口78 root.geometry(560x400+200+20079 app = Application(master=root) 80 81 root.mainloop() 多图示例如何利用Matplotlib在一张图里面,包含多张子图,如下所示: 多图核心代码其他代码和上例保持一致,只是在创建图表时略有差异。主要是利用plt.subplot(2,2,1)方法对图片进行切分。如下所示: 8 self.figure.text(0.45,0.94,1)">这是四幅图') 设置显示的文本 一张图上显示4张小图 10 x = np.linspace(-6,6,10011 y = np.sin(x) 正弦曲线 12 y2 = np.cos(x) 余弦曲线 13 y3 = np.tan(x) tan函数 14 y4 = np.square(x) 平方函数 15 fig1 = plt.subplot(2,1)"> 先进行分块,最后一个参数是序号 16 self.setplot(fig1,x,y,1)">17 fig2 = plt.subplot(2,218 self.setplot(fig2,1)">19 fig3 = plt.subplot(2,320 self.setplot(fig3,y3,1)">y=tan(x)black21 fig4 = plt.subplot(2,422 self.setplot(fig4,y4,1)">y=square(x)23 24 def setplot(self,fig,text,1)">r): 25 绘制子图26 line = fig.plot(x,color=color,label=text) 27 fig.set_xlabel(28 fig.set_ylabel(29 fig.grid(which=30 fig.legend(loc=View Code 柱状图示例如何利用Matplotlib绘制柱状图,如下所示: 其他代码和上例保持一致,只是在创建图表时略有差异。主要是通过bar 函数创建柱状图,如下所示: 这是柱状图图 9 x = np.arange(1210 y = np.random.uniform(0.5,1.0,12) * (1 - x / float(12)) 11 loc = zip(x,y) 将x,y 两两配对 12 plt.ylim(0,1.2) 设置y轴的范围 13 plt.bar(x,1)"> 绘制柱状图(填充颜色绿色,边框黑色) for x,y in loc: 15 plt.text(x + 0.1,y + 0.01,1)">%.2f' % y,ha=bottom 保留小数点2位 备注Matplotlib的图表形式还有很多,本例只是抛砖引玉,简述两种图表的生成方式,其他的图表则不做赘述。 如需源码链接,可点击链接下载。一首小词,舒缓一下心情。 浣溪沙·堤上游人逐画船 宋代:欧阳修 堤上游人逐画船,拍堤春水四垂天。绿杨楼外出秋千。 白发戴花君莫笑,六幺催拍盏频传。人生何处似樽前! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |