其他
matplotlib教程——matplotlib与tkinter集成
进入正文
matplotlib是Python生态圈里面最为流行的图形可视化库,提供了庞大而且完善的绘图功能,在绝大多数情况下,基本上只要是你想要实现的功能,均可以通过matplotlib完成。
tkinter是python系统自带的GUI可视化库,原理简单,非常方便我们实现桌面应用程序。
有时候我们在使用Python边写桌面应用程序的时候,希望在窗体程序内部展现绘图细节和绘图功能,本文的主要内容就是tkinter+matplotlib。
当然窗体化的绘图还有其他的解决方案,比如使用使用Chaco绘图库也可以实现类似的功能。
2.1
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()
matplotlib和tkinter的集成主要是分为两个部分:
第一部分是将绘制的图形结合tkinter,实现该功能遵循“三步走”,三个步骤。
第二部分是将matplotlib自带的工具条结合tkinter,实现该功能也是遵循“三步走”,三个步骤。
3.1
#把绘制的图形显示到tkinter窗口上
#第一步 :当然这里不一定显示在root,可以使frame,tabcontrol等等
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)
3.2
#第一步 :把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)
matplotlib结合tkinter是可以做出比较强大的桌面程序的,也可以实现较为美观的可视化操作,本文只是实现,很多的美化操作没有实现,相关的配置可以参考之前写的文章。在具体的实现的时候,按照步骤一步一步来,就可以了,当然还会有其他的实现方式,若您看过文章之后有什么疑问,或者是有什么更好的提议,欢迎一起交流!
END
往期回顾
●python可视化——详解matplotlib的配置文件以及配置方式
●numpy进阶之 Structured Array和Record Array