在日常应用程序开发中,图表(折线图,柱状图等)以其直观显示,清晰明了的优势,使得应用范围越来越广泛,本文以一个简单的小例子,简述如何将Tkinter和Matplotlib相互关联起来,在应用程序中嵌入图表,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

  1. Tkinter 是Python内置的桌面程序开发组件库,包含日常使用的基础组件(如:Label,Button,Entry等),利用Tkinter可以方便的开发可视化程序。
  2. Matplotlib 是一个开源的数据可视化类库,利用matplotlib可以绘制各种类型的图表(如:折线图,柱状图,散点图等)。
  3. Numpy 是一个开源的数学相关的类库,广泛应用于数学计算等领域。本例主要使用Numpy提供的数学函数和随机数生成数据源。

操作步骤

如果要将matplotlib生成图表和Tkinter生成的GUI程序关联起来,需要以下3个步骤:

  1. 创建Matplotlib的figure(画布)对象,并在figure上进行绘图。
  2. 创建FigureCanvasTkAgg(画布容器)对象,参数为第1步生成的figure对象和容器存放的父对象,并调用创建对象的draw函数。
  3. 调用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在应用程序中内嵌图表相关推荐

  1. layui数据表格(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)

    表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table.layui table ...

  2. 【Python基础】利用 Python 搞定精美网络图!

    作者:叶庭云     编辑:Lemon      出品:Python数据之道 一.NetworkX 概述 NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复 ...

  3. python画圆形螺旋线_【Python基础】利用 Python 搞定精美网络图!

    作者:叶庭云     编辑:Lemon      出品:Python数据之道 一.NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂 ...

  4. python基础教程第三版豆瓣-1024,程序媛/猿请查收!

    点击上方蓝字关注我们 节专享福利:1024程序员 本期活动,不仅有赠书福利,且有购书福利,图灵公司联合当当网特意为{印象python}读者们申请了一波购书福利.感兴趣的读者朋友,请下拉至文末,领取福利 ...

  5. python基础教程第二版答案-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

  6. python基础教程第二版和第三版有什么区别-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

  7. python 控件失去焦点_Tk / Tkinter:检测应用程序失去焦点 - python

    我正在申请Tkinter.在应用程序中,我想弹出一个上下文菜单,这是使用Tk.Menu.post()完成的. 当应用程序失去焦点时,我不知道如何使此菜单消失.我需要执行此操作,因为即使在切换到另一个窗 ...

  8. python输出文本框_让tkinter在文本框中显示输出

    我试图创建一个小的GUI,当用户在文本框中输入一个数字时,它显示(作为标签)是否是素数.让tkinter在文本框中显示输出 我目前"工作"的代码(因为没有错误显示),但标签不会改变 ...

  9. python缩进可以用在任何语句之后_Python程序中,缩进表达所属关系,在缩进的前一行最后,需要使用符号 Python 语句中增...

    Python程序中,缩进表达所属关系,在缩进的前一行最后,需要使用英文冒号 : 符号. 缩进在python代码中的重要性,缩进不规范程序就不能运行.这也是python比其他编程语言简单的地方,用缩进来 ...

最新文章

  1. 惰性求值 php,详细介绍C#函数式编程的示例代码
  2. springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题
  3. python实现希尔排序
  4. 刷抖音对手机有什么要求_6频段全面5G手机 nova6 5G成新年换机最佳之选
  5. 修改MONGODB 最大连接数
  6. java扫描指定package注解_java获取包下被指定注解的类
  7. 受保护的属性无法直接读取
  8. 正则表达式基础知识,持续更新…
  9. 中国移动开通eSIM 一号双终端将要取代传统SIM卡?
  10. java pic 通信_dsPic33E:RS485通信问题
  11. php批量删除例子,php批量删除数据完整实例代码
  12. 删除putty的session 以及 putty的颜色设置值
  13. 关于 onchange,onpropertychange,oninput事件
  14. ElasticJob‐Lite:扩展作业类型
  15. 【心理咨询师考试笔记】基础理论(四)——发展心理学
  16. 从零开始搭建Java环境
  17. 音视频开发 人脸标定 animoji 动态贴纸 小项目练习总结
  18. 第三次工业革命(四)
  19. 数据库审计系统在加密传输场景下的应用(SinoDB)
  20. 20200226省选模拟赛(by Tiw) T1 客星(长链剖分)

热门文章

  1. 大宝(sodme)的专栏
  2. Spring Boot(二)——MyBatis
  3. linux awk 结果转数组,Linux中的awk数组的基本使用方法
  4. 想要爬虫获取百度指数,浏览器的cookie怎么获得?
  5. Win7电脑系统崩溃怎么解决?
  6. matlab滤波器在哪,在使用MATLAB进行滤波器设计时,需要注意的是:使用FDAtool工具所设计的滤波器是(    )滤波器。...
  7. Python的glob模块
  8. 【踩坑日记】springboot项目启动报错error create bean with name
  9. 解决ohmyzsh下载时连接超时
  10. 医疗机器人软件中的机器人协作技术:机器人技术在医疗保健中的应用