将Matplotlib绘制的图显示到Tkinter中(详细教程)

将Matplotlib绘制的图显示到Tkinter中(详细教程)

参考文献:https://blog.csdn.net/SHU15121856/article/details/87307124

运行环境:win10、python3

用Matplotlib自定义绘制图形

三次贝塞尔曲线有四个控制点,曲线在起始点与1,2两个点相切,在结束点与3,4两个点相切。

from matplotlib.path import Path
from matplotlib.patches import PathPatch
from matplotlib import pyplot as plt

fig, ax = plt.subplots()

# 定义绘图指令与控制点坐标
path_data = [
    (Path.MOVETO, (0, 1)),  # 绘图起始点.从这里往后4个点控制一条3次贝塞尔曲线
    (Path.CURVE4, (-1, 1)),
    (Path.CURVE4, (-2, 3)),
    (Path.CURVE4, (-1, 2)),
    (Path.LINETO, (0, 2)),  # 绘制一条直线.从这里往后3个点控制一条2次贝塞尔曲线
    (Path.CURVE3, (1, 2)),
    (Path.CURVE3, (2, 3)),
    (Path.CLOSEPOLY, (0, 1))  # 最后一个点,结束绘制.这里让它等于第一个点也就是闭合了,才构成图形
]

# 序列解包再zip重组,将指令放在一起,坐标放在一起(得到两个元组)
codes, verts = zip(*path_data)  # 这里的等号也是一种序列解包,将[(),()]解成两个()

# 根据顶点和指令创建Path对象
path = Path(verts, codes)
# 根据Path对象创建图形对象
path_patch = PathPatch(path, facecolor='g', alpha=0.8)
# 将这个图形添加到图上
ax.add_patch(path_patch)

# 绘制控制点和连线
x, y = zip(*verts)
line, = ax.plot(x, y, 'bo-')  # blue,圆点,直线

ax.grid()

ax.axis('equal')  # 坐标轴刻度大小相等

plt.plot()
plt.show()

在这里插入图片描述

将Matplotlib绘制的图显示到Tkinter中

tkinter是python的一个GUI库,有时候PC端UI界面上需要显示复杂的图时候就会用到这点。

import tkinter
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure

root = tkinter.Tk()  # 创建tkinter的主窗口
root.title("在tkinter中使用matplotlib")

f = Figure(figsize=(5, 4), dpi=100)
a = f.add_subplot(111)  # 添加子图:1行1列第1个

# 生成用于绘sin图的数据
x = np.arange(0, 3, 0.01)
y = np.sin(2 * np.pi * x)

# 在前面得到的子图上绘图
a.plot(x, y)

# 将绘制的图形显示到tkinter:创建属于root的canvas画布,并将图f置于画布上
canvas = FigureCanvasTkAgg(f, master=root)
canvas.draw()  # 注意show方法已经过时了,这里改用draw
canvas.get_tk_widget().pack(side=tkinter.TOP,  # 上对齐
                            fill=tkinter.BOTH,  # 填充方式
                            expand=tkinter.YES)  # 随窗口大小调整而调整

# matplotlib的导航工具栏显示上来(默认是不会显示它的)
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas._tkcanvas.pack(side=tkinter.TOP,  # get_tk_widget()得到的就是_tkcanvas
                      fill=tkinter.BOTH,
                      expand=tkinter.YES)


def on_key_event(event):
    """键盘事件处理"""
    print("你按了%s" % event.key)
    key_press_handler(event, canvas, toolbar)


# 绑定上面定义的键盘事件处理函数
canvas.mpl_connect('key_press_event', on_key_event)


def _quit():
    """点击退出按钮时调用这个函数"""
    root.quit()  # 结束主循环
    root.destroy()  # 销毁窗口


# 创建一个按钮,并把上面那个函数绑定过来
button = tkinter.Button(master=root, text="退出", command=_quit)
# 按钮放在下边
button.pack(side=tkinter.BOTTOM)

# 主循环
root.mainloop()

运行结果:
在这里插入图片描述
注意:NavigationToolbar2TkAgg已经被弃用了,使用python3.5.2中的命令为NavigationToolbar2Tk

例子2

import math
import numpy as np   
#-------------------------------------------------------------------------------------------
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk #NavigationToolbar2TkAgg
#------------------------------------------------------------------------------------------
import tkinter as tk
#------------------------------------------------------------------------------------------
 
 
mpl.rcParams['font.sans-serif'] = ['SimHei']  #中文显示
mpl.rcParams['axes.unicode_minus']=False      #负号显示
 
class From:
    def __init__(self): 
        self.root=tk.Tk()                    #创建主窗体
        self.canvas=tk.Canvas()              #创建一块显示图形的画布
        self.figure=self.create_matplotlib() #返回matplotlib所画图形的figure对象
        self.create_form(self.figure)        #将figure显示在tkinter窗体上面
        self.root.mainloop()
 
    def create_matplotlib(self):
        #创建绘图对象f
        f=plt.figure(num=2,figsize=(16,12),dpi=80,facecolor="pink",edgecolor='green',frameon=True)
        #创建一副子图
        fig1=plt.subplot(1,1,1)
 
        x=np.arange(0,2*np.pi,0.1)
        y1=np.sin(x)
        y2=np.cos(x)
 
        line1,=fig1.plot(x,y1,color='red',linewidth=3,linestyle='--')    #画第一条线
        line2,=fig1.plot(x,y2) 
        plt.setp(line2,color='black',linewidth=8,linestyle='-',alpha=0.3)#华第二条线
 
        fig1.set_title("这是第一幅图",loc='center',pad=20,fontsize='xx-large',color='red')    #设置标题
        line1.set_label("正弦曲线")                                                           #确定图例
        fig1.legend(['正弦','余弦'],loc='upper left',facecolor='green',frameon=True,shadow=True,framealpha=0.5,fontsize='xx-large')
 
        fig1.set_xlabel('横坐标')                                                             #确定坐标轴标题
        fig1.set_ylabel("纵坐标")
        fig1.set_yticks([-1,-1/2,0,1/2,1])                                                   #设置坐标轴刻度
        fig1.grid(which='major',axis='x',color='r', linestyle='-', linewidth=2)              #设置网格
        
        return f
 
    def create_form(self,figure):
        #把绘制的图形显示到tkinter窗口上
        self.canvas=FigureCanvasTkAgg(figure,self.root)
        self.canvas.draw()  #以前的版本使用show()方法,matplotlib 2.2之后不再推荐show()用draw代替,但是用show不会报错,会显示警告
        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
 
        #把matplotlib绘制图形的导航工具栏显示到tkinter窗口上
        toolbar =NavigationToolbar2Tk(self.canvas, self.root) #matplotlib 2.2版本之后推荐使用NavigationToolbar2Tk,若使用NavigationToolbar2TkAgg会警告
        toolbar.update()
        self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
 
if __name__=="__main__":
    form=From()

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2167.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • JVM内存结构图解

    JVM内存结构图解一 真实系统中的概念  JVM(JavaVirtualMachine),顾名思义是对真实计算机系统的模拟,正因如此才能屏蔽物理机器的变化,从而实现“一次编译,到处运行”。  相信很多Java程序员经常听到堆、栈等概念,也会进行设置调优以让Java应用能够更好地运行,但对于JVM与真实计算机系统之间的关系并没有特别清晰的认识。因此,这里先简单介绍下真实计算机系统中的一

  • QGridLayout中multi cell处理

    QGridLayout中multi cell处理

  • MySQL concat函数的使用

    MySQL concat函数的使用MySQLconcat函数是MySQL数据库中众多的函数之一,下文将对MySQLconcat函数的语法和使用进行说明,供您参考和学习。MySQLconcat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL。注意:如果所有参数均为非二进制字符串,则结果为非二进制字符串。 

  • 执行python程序的两种方式

    执行python程序的两种方式执行python程序的两种方式交互式python是高级(解释型)语言,写一句执行一句。命令行式python和python解释器是一种东西,我们说的打开python就是打开python解释器。

  • 用python图像处理_python图像处理库

    用python图像处理_python图像处理库第1章图像处理入门1.1什么是图像处理及图像处理的应用1.1.1什么是图像以及图像是如何存储的1.1.2什么是图像处理1.1.3图像处理的应用1.2图像处理流程1.3在Python中安装不同的图像处理库1.3.1安装pip1.3.2在Python中安装图像处理库1.3.3安装Anaconda发行版1.3.4安装Jupyter笔记本1.4使用Pytho…

  • setfacl解释「建议收藏」

    setfacl解释「建议收藏」setfacl:设置文件访问控制列表,针对单独文件,设置单独用户权限用法:setfacl-参数用户权限文件参数:-m,–modify=acl更改文件的访问控制列表-M,–modify-file=file从文件读取访问控制列表条目更改-x,–remove=acl根据文件中访问控制列表移除条目-X,–remove-file=file从文件读取访问控制列表条目…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号