Python基础之利用Matplotlib和Tkinter在应用程序中内嵌图表
在日常应用程序开发中,图表(折线图,柱状图等)以其直观显示,清晰明了的优势,使得应用范围越来越广泛,本文以一个简单的小例子,简述如何将Tkinter和Matplotlib相互关联起来,在应用程序中嵌入图表,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点
- Tkinter 是Python内置的桌面程序开发组件库,包含日常使用的基础组件(如:Label,Button,Entry等),利用Tkinter可以方便的开发可视化程序。
- Matplotlib 是一个开源的数据可视化类库,利用matplotlib可以绘制各种类型的图表(如:折线图,柱状图,散点图等)。
- Numpy 是一个开源的数学相关的类库,广泛应用于数学计算等领域。本例主要使用Numpy提供的数学函数和随机数生成数据源。
操作步骤
如果要将matplotlib生成图表和Tkinter生成的GUI程序关联起来,需要以下3个步骤:
- 创建Matplotlib的figure(画布)对象,并在figure上进行绘图。
- 创建FigureCanvasTkAgg(画布容器)对象,参数为第1步生成的figure对象和容器存放的父对象,并调用创建对象的draw函数。
- 调用FigureCanvasTkAgg对应组件的Pack方法,将对象显示在页面上。
示例效果图
将Matplotlib生成的曲线图,嵌入到普通的windows程序中,如下图所示:
核心代码
创建图表代码
def create_matplotlib(self):"""创建绘图对象"""# 设置中文显示字体mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示mpl.rcParams['axes.unicode_minus'] = False # 负号显示# 创建绘图对象f figsize的单位是英寸 像素 = 英寸*分辨率self.figure = plt.figure(num=2, figsize=(7, 4), dpi=80, facecolor="gold", edgecolor='green', frameon=True)# 创建一副子图fig1 = plt.subplot(1, 1, 1) # 三个参数,依次是:行,列,当前索引# 创建数据源:x轴是等间距的一组数x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)y1 = np.sin(x)y2 = np.cos(x)line1 = fig1.plot(x, y1, color='red', linewidth=2, label='y=sin(x)', linestyle='--') # 画第一条线line2 = fig1.plot(x, y2, color='green', label='y=cos(x)')plt.setp(line2, linewidth=1, linestyle='-', alpha=0.7) # 华第二条线 color='',fig1.set_title("数学曲线图", loc='center', pad=20, fontsize='xx-large', color='red') # 设置标题# line1.set_label("正弦曲线") # 确定图例# 定义legend 重新定义了一次labelfig1.legend(['正弦', '余弦'], loc='lower right', facecolor='orange', frameon=True, shadow=True, framealpha=0.7)# ,fontsize='xx-large'fig1.set_xlabel('(x)横坐标') # 确定坐标轴标题fig1.set_ylabel("(y)纵坐标")fig1.set_yticks([-1, -1 / 2, 0, 1 / 2, 1]) # 设置坐标轴刻度fig1.grid(which='major', axis='x', color='gray', linestyle='-', linewidth=0.5, alpha=0.2) # 设置网格
创建图表容器,并显示代码
def createWidget(self, figure):"""创建组件"""self.label = Label(self, text='这是一个Tkinter和Matplotlib相结合的小例子')self.label.pack()# 创建画布self.canvas = FigureCanvasTkAgg(figure, self)self.canvas.draw()self.canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)# 把matplotlib绘制图形的导航工具栏显示到tkinter窗口上# toolbar = NavigationToolbar2Tk(self.canvas, self)# toolbar.update()# self.canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1)# self.button = Button(master=self, text="退出", command=quit)# # 按钮放在下边# self.button.pack(side=BOTTOM)
整体代码及调用逻辑,如下所示:
from tkinter import *
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tkclass Application(Frame):"""一个经典的GUI写法"""def __init__(self, master=None):'''初始化方法'''super().__init__(master) # 调用父类的初始化方法self.master = masterself.pack(side=TOP, fill=BOTH, expand=1) # 此处填充父窗体self.create_matplotlib()self.createWidget(self.figure)def createWidget(self, figure):"""创建组件"""self.label = Label(self, text='这是一个Tkinter和Matplotlib相结合的小例子')self.label.pack()# 创建画布self.canvas = FigureCanvasTkAgg(figure, self)self.canvas.draw()self.canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)# 把matplotlib绘制图形的导航工具栏显示到tkinter窗口上# toolbar = NavigationToolbar2Tk(self.canvas, self)# toolbar.update()# self.canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1)# self.button = Button(master=self, text="退出", command=quit)# # 按钮放在下边# self.button.pack(side=BOTTOM)def create_matplotlib(self):"""创建绘图对象"""# 设置中文显示字体mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示mpl.rcParams['axes.unicode_minus'] = False # 负号显示# 创建绘图对象f figsize的单位是英寸 像素 = 英寸*分辨率self.figure = plt.figure(num=2, figsize=(7, 4), dpi=80, facecolor="gold", edgecolor='green', frameon=True)# 创建一副子图fig1 = plt.subplot(1, 1, 1) # 三个参数,依次是:行,列,当前索引# 创建数据源:x轴是等间距的一组数x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)y1 = np.sin(x)y2 = np.cos(x)line1 = fig1.plot(x, y1, color='red', linewidth=2, label='y=sin(x)', linestyle='--') # 画第一条线line2 = fig1.plot(x, y2, color='green', label='y=cos(x)')plt.setp(line2, linewidth=1, linestyle='-', alpha=0.7) # 华第二条线 color='',fig1.set_title("数学曲线图", loc='center', pad=20, fontsize='xx-large', color='red') # 设置标题# line1.set_label("正弦曲线") # 确定图例# 定义legend 重新定义了一次labelfig1.legend(['正弦', '余弦'], loc='lower right', facecolor='orange', frameon=True, shadow=True, framealpha=0.7)# ,fontsize='xx-large'fig1.set_xlabel('(x)横坐标') # 确定坐标轴标题fig1.set_ylabel("(y)纵坐标")fig1.set_yticks([-1, -1 / 2, 0, 1 / 2, 1]) # 设置坐标轴刻度fig1.grid(which='major', axis='x', color='gray', linestyle='-', linewidth=0.5, alpha=0.2) # 设置网格def destroy(self):"""重写destroy方法"""super().destroy()quit()def quit():"""点击退出按钮时调用这个函数"""root.quit() # 结束主循环root.destroy() # 销毁窗口if __name__ == '__main__':root = Tk()root.title('数学曲线窗口')root.geometry('560x400+200+200')app = Application(master=root)root.mainloop()
多图示例
如何利用Matplotlib在一张图里面,包含多张子图,如下所示:
多图核心代码
其他代码和上例保持一致,只是在创建图表时略有差异。主要是利用plt.subplot(2, 2, 1)方法对图片进行切分。如下所示:
def create_matplotlib(self):"""创建绘图对象"""# 设置中文显示字体mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示mpl.rcParams['axes.unicode_minus'] = False # 负号显示# 创建绘图对象f figsize的单位是英寸 像素 = 英寸*分辨率self.figure = plt.figure(num=2, figsize=(7, 4), dpi=80, facecolor="gold", edgecolor='green', frameon=True)self.figure.text(0.45, 0.94, '这是四幅图') # 设置显示的文本# 一张图上显示4张小图x = np.linspace(-6, 6, 100)y = np.sin(x) # 正弦曲线y2 = np.cos(x) # 余弦曲线y3 = np.tan(x) # tan函数y4 = np.square(x) # 平方函数fig1 = plt.subplot(2, 2, 1) # 先进行分块,最后一个参数是序号self.setplot(fig1, x, y, 'y=sin(x)', 'red')fig2 = plt.subplot(2, 2, 2)self.setplot(fig2, x, y2, 'y=cos(x)', 'green')fig3 = plt.subplot(2, 2, 3)self.setplot(fig3, x, y3, 'y=tan(x)', 'black')fig4 = plt.subplot(2, 2, 4)self.setplot(fig4, x, y4, 'y=square(x)', 'gold')def setplot(self, fig, x, y, text, color='r'):"""绘制子图"""line = fig.plot(x, y, color=color, label=text)fig.set_xlabel('(x)横坐标') # 确定坐标轴标题fig.set_ylabel("(y)纵坐标")fig.grid(which='major', axis='x', color='gray', linestyle='-', linewidth=0.5, alpha=0.2) # 设置网格fig.legend(loc='lower right', facecolor='orange', frameon=True, shadow=True, framealpha=0.7)
柱状图示例
如何利用Matplotlib绘制柱状图,如下所示:
柱状图核心代码
其他代码和上例保持一致,只是在创建图表时略有差异。主要是通过bar 函数创建柱状图,如下所示:
def create_matplotlib(self):"""创建绘图对象"""# 设置中文显示字体mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示mpl.rcParams['axes.unicode_minus'] = False # 负号显示# 创建绘图对象f figsize的单位是英寸 像素 = 英寸*分辨率self.figure = plt.figure(num=2, figsize=(7, 4), dpi=80, facecolor="gold", edgecolor='green', frameon=True)self.figure.text(0.45, 0.94, '这是柱状图图') # 设置显示的文本x = np.arange(12)y = np.random.uniform(0.5, 1.0, 12) * (1 - x / float(12))loc = zip(x, y) # 将x, y 两两配对plt.ylim(0, 1.2) # 设置y轴的范围plt.bar(x, y, facecolor='green', edgecolor='black') # 绘制柱状图(填充颜色绿色,边框黑色)for x, y in loc:plt.text(x + 0.1, y + 0.01, '%.2f' % y, ha='center', va='bottom') # 保留小数点2位
备注
Matplotlib的图表形式还有很多,本例只是抛砖引玉,简述两种图表的生成方式,其他的图表则不做赘述。
如需源码链接,可点击链接下载。一首小词,舒缓一下心情。
浣溪沙·堤上游人逐画船
宋代:欧阳修
堤上游人逐画船,拍堤春水四垂天。绿杨楼外出秋千。
白发戴花君莫笑,六幺催拍盏频传。人生何处似樽前!
Python基础之利用Matplotlib和Tkinter在应用程序中内嵌图表相关推荐
- layui数据表格(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)
表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table.layui table ...
- 【Python基础】利用 Python 搞定精美网络图!
作者:叶庭云 编辑:Lemon 出品:Python数据之道 一.NetworkX 概述 NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复 ...
- python画圆形螺旋线_【Python基础】利用 Python 搞定精美网络图!
作者:叶庭云 编辑:Lemon 出品:Python数据之道 一.NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂 ...
- python基础教程第三版豆瓣-1024,程序媛/猿请查收!
点击上方蓝字关注我们 节专享福利:1024程序员 本期活动,不仅有赠书福利,且有购书福利,图灵公司联合当当网特意为{印象python}读者们申请了一波购书福利.感兴趣的读者朋友,请下拉至文末,领取福利 ...
- python基础教程第二版答案-《Python基础教程》(第2版修订版)中要注意的地方...
想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...
- python基础教程第二版和第三版有什么区别-《Python基础教程》(第2版修订版)中要注意的地方...
想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...
- python 控件失去焦点_Tk / Tkinter:检测应用程序失去焦点 - python
我正在申请Tkinter.在应用程序中,我想弹出一个上下文菜单,这是使用Tk.Menu.post()完成的. 当应用程序失去焦点时,我不知道如何使此菜单消失.我需要执行此操作,因为即使在切换到另一个窗 ...
- python输出文本框_让tkinter在文本框中显示输出
我试图创建一个小的GUI,当用户在文本框中输入一个数字时,它显示(作为标签)是否是素数.让tkinter在文本框中显示输出 我目前"工作"的代码(因为没有错误显示),但标签不会改变 ...
- python缩进可以用在任何语句之后_Python程序中,缩进表达所属关系,在缩进的前一行最后,需要使用符号 Python 语句中增...
Python程序中,缩进表达所属关系,在缩进的前一行最后,需要使用英文冒号 : 符号. 缩进在python代码中的重要性,缩进不规范程序就不能运行.这也是python比其他编程语言简单的地方,用缩进来 ...
最新文章
- 惰性求值 php,详细介绍C#函数式编程的示例代码
- springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题
- python实现希尔排序
- 刷抖音对手机有什么要求_6频段全面5G手机 nova6 5G成新年换机最佳之选
- 修改MONGODB 最大连接数
- java扫描指定package注解_java获取包下被指定注解的类
- 受保护的属性无法直接读取
- 正则表达式基础知识,持续更新…
- 中国移动开通eSIM 一号双终端将要取代传统SIM卡?
- java pic 通信_dsPic33E:RS485通信问题
- php批量删除例子,php批量删除数据完整实例代码
- 删除putty的session 以及 putty的颜色设置值
- 关于 onchange,onpropertychange,oninput事件
- ElasticJob‐Lite:扩展作业类型
- 【心理咨询师考试笔记】基础理论(四)——发展心理学
- 从零开始搭建Java环境
- 音视频开发 人脸标定 animoji 动态贴纸 小项目练习总结
- 第三次工业革命(四)
- 数据库审计系统在加密传输场景下的应用(SinoDB)
- 20200226省选模拟赛(by Tiw) T1 客星(长链剖分)
热门文章
- 大宝(sodme)的专栏
- Spring Boot(二)——MyBatis
- linux awk 结果转数组,Linux中的awk数组的基本使用方法
- 想要爬虫获取百度指数,浏览器的cookie怎么获得?
- Win7电脑系统崩溃怎么解决?
- matlab滤波器在哪,在使用MATLAB进行滤波器设计时,需要注意的是:使用FDAtool工具所设计的滤波器是( )滤波器。...
- Python的glob模块
- 【踩坑日记】springboot项目启动报错error create bean with name
- 解决ohmyzsh下载时连接超时
- 医疗机器人软件中的机器人协作技术:机器人技术在医疗保健中的应用