如何将matplotlib绘制的图表镶嵌入tkinter做的界面中?

c060635 2012-12-23 01:34:47
RT,就是能在界面中显示图表,而不是新的窗口中显示。
...全文
1947 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2014-11-04
  • 打赏
  • 举报
回复
引用 6 楼 zhouchongzxc 的回复:
我想你应该需要新的例子作为参考 把下面代码中的“~”变成空格就可以了(我没有3.2版本的matplotlib,只有2.7的,应该是一样的吧)
有点好奇, 贴带"~"的代码是出于什么考虑?
p_h_king 2014-11-04
  • 打赏
  • 举报
回复
请问colorbar怎么嵌入?
ChongQingJin28 2012-12-24
  • 打赏
  • 举报
回复
我想你应该需要新的例子作为参考
把下面代码中的“~”变成空格就可以了(我没有3.2版本的matplotlib,只有2.7的,应该是一样的吧)

import~matplotlib
matplotlib.use('TkAgg')
from~matplotlib.backends.backend_tkagg~import~FigureCanvasTkAgg~
from~matplotlib.figure~import~Figure
from~Tkinter~import~*

root~=~Tk()

f~=~Figure(figsize=(5,4),dpi=100)
f_plot~=~f.add_subplot(111~)

def~other_picture_alg():~~~#数据相关的算法应该与plot分离开
~~~~x=[1,2,3,4,5,6,7,8,9,10]~~~~~~
~~~~y=[3,6,9,12,15,18,15,12,15,18]
~~~~return~x,y


def~draw_picture():
~~~~f_plot.clear()
~~~~x=[1,2,3,4,5,6,7,8,9,10]~~~~~~#关于数据的部分可以提取出来
~~~~y=[3,6,9,12,15,18,21,24,27,30]
~~~~f_plot.plot(x,y)
~~~~canvs.draw()

def~draw_picture2():
~~~~f_plot.clear()
~~~~x=[1,2,3,4,5,6,7,8,9,10]~~~~~#关于数据的部分可以提取出来
~~~~y=[2,4,6,8,10,8,6,4,2,0]
~~~~f_plot.plot(x,y)
~~~~canvs.draw()

def~draw_picture3():
~~~~f_plot.clear()
~~~~x,y~=~other_picture_alg()~~~~#使用由算法生成的数据,可以避免重复的运算过程
~~~~f_plot.plot(x,y)
~~~~canvs.draw()

canvs~=~FigureCanvasTkAgg(f,root)
canvs.get_tk_widget().pack(side=TOP~,fill=BOTH~,expand~=1)
Button(root,~text~=~'pic',command~=~draw_picture).pack()
Button(root,~text~=~'pic2',command~=~draw_picture2).pack()
Button(root,~text~=~'pic3',command~=~draw_picture3).pack()

root.mainloop()

顺便说一下,我对于Tk也不是很了解(我比较喜欢PyQt)。
还是你自己找一个与PIL相似的库吧!
c060635 2012-12-24
  • 打赏
  • 举报
回复
真心谢谢了! 解决了我很多卡住的问题。
c060635 2012-12-23
  • 打赏
  • 举报
回复
刚刚接触tkinter,都不是很懂。。 关于图表的显示主要在41-43行,91-11行。 顺便问下怎么做窗口的背景?一定要用PIL吗?
c060635 2012-12-23
  • 打赏
  • 举报
回复
from tkinter import *
from random import random
from math import sqrt
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
root = Tk()
root.wm_title('Gas')
def pe():
    print(N.get(),Energy.get(),Step.get(),State.get())
def _quit():
    root.quit()
    root.destroy()
def step(atom,Dv):
    for i in range (len(atom)-2):
        dv = -Dv+Dv*2*random()
        if (atom[i]['v']+dv)**2/2-atom[i]['e'] < atom['demon']['e']:
            atom['demon']['e'] += -(atom[i]['v']+dv)**2/2+atom[i]['e']
            atom[i]['v'] = atom[i]['v']+dv
            atom[i]['e'] = (atom[i]['v'])**2/2
    return atom
def ideal_gas(
        N,                              # Number of particles
        totalEnergy,                        # total of demon and system energy
        steps,                          # number of simulation steps
        state,                        # Initial state 1 or 2
    ):
    atom = {}
    for i in range (N):
        atom[i] = {}
        atom[i]['e'] = totalEnergy/N*(2-state)  #depending on state
        atom[i]['v'] = sqrt(atom[i]['e']*2)     # mass=1
    atom['demon'] = {'e':totalEnergy*(state-1)}  #depending on state
    for i in range(steps):
        atom = step(atom,sqrt(2*totalEnergy/N/10))
        atom['demonh'] = atom.get('demonh',[])+[(atom['demon']['e'])]#store energy of demon for figure
    return atom
def gas():
    ideal_gas(N.get(),Energy.get(),Step.get(),State.get())

figure1 = Figure(figsize=(5,4), dpi=100)
figure2 = Figure(figsize=(5,4), dpi=100)
figure3 = Figure(figsize=(5,4), dpi=100)
def draw_picture():
    a1 = figure1.add_subplot(111)
    sys_e = []
    x = []
    total_e = []
    for N in range (50,501,50):
        atom = ideal_gas(N,500,1000,1)
        sys_e.append(500-atom['demon']['e'])
        x.append(N)
        total_e.append(500)
    a1.plot(x,total_e)
    a1.plot(x,sys_e)
    a1.convert_xunits('J')
    a1.set_xlabel("N")
    a1.set_ylabel("Energy")
    a1.set_title('Energy')

    a2 = figure2.add_subplot(111)
    fr = {}
    f = []
    x = []
    for i in range (N):
        fr[atom[i]['v']//1] = fr.get(atom[i]['v']//1,0)+1
    for key in fr:
        x.append(key)
        f.append(fr[key])
    a2.bar(x,f,width = 1)
    a2.convert_xunits('J')
    a2.set_xlabel("v")
    a2.set_ylabel("Frequency")
    a2.set_title('V-Frequency')

    a3 = figure3.add_subplot(111)
    fr = {}
    f = []
    x = []
    for i in range (Step):
        fr[atom['demonh'][i]//1] = fr.get(atom['demonh'][i]//1,0)+1
    for key in fr:
        x.append(key)
        f.append(fr[key])
    a3.bar(x,f,width = 1)
    a3.convert_xunits('J')
    a3.set_xlabel("Demon Energy")
    a3.set_ylabel("Frequency")
    a3.set_title('Demon Energy-Frequency')

def enter():
    gas()
    draw_picture()

def p1():
    canvas = FigureCanvasTkAgg(figure1,root)
    canvas.get_tk_widget().pack(anchor = E , expand=1)
    canvas.show()

def p2():
    canvas = FigureCanvasTkAgg(figure2,root)
    canvas.get_tk_widget().pack(anchor = E ,side=RIGHT, expand=1)
    canvas.show()

def p3():
    canvas = FigureCanvasTkAgg(figure3,root)
    canvas.get_tk_widget().pack(anchor = E ,side=RIGHT, expand=1)
    canvas.show()

canvas = FigureCanvasTkAgg(figure1,root)
canvas.get_tk_widget().pack(anchor = E , expand=1)

root.geometry('960x600')
label_N = Label(root,text = 'Please input the number of atoms:')
label_Energy = Label(root,text = 'Please input the energy of atoms:')
label_Step = Label(root,text = 'Please input the step you want to go:')
N = IntVar()
entry_N = Entry(root,textvariable = N)
entry_N.pack()
Energy = IntVar()
entry_Energy = Entry(root,textvariable = Energy)
entry_Energy.pack()
Step = IntVar()
entry_Step = Entry(root,textvariable = Step)
entry_Step.pack()
button_enter = Button(root,text = 'Enter',command = enter)
button_enter.pack()
button_enter.place(height = 30,width = 100,x = 75,y = 500)
button_quit = Button(root,text = 'Quit',command = _quit)
button_quit.pack()
button_quit.place(height = 30,width = 100,x = 225,y = 500)
label_N.pack()
label_N.place(x = 20,y = 100,anchor = NW)
label_Energy.pack()
label_Energy.place(x = 20,y = 150,anchor = NW)
label_Step.pack()
label_Step.place(x = 20,y = 200,anchor = NW)
entry_N.place(in_=label_N,relx = 1.076)
entry_Energy.place(in_=label_Energy,relx = 1.1)
entry_Step.place(in_=label_Step,relx = 1)
State = IntVar()
radiobutton_demon = Radiobutton(root,variable = State,text = 'Give all the energy to demon',value = 1)
radiobutton_system = Radiobutton(root,variable = State,text = 'Give all the energy to system',value = 2)
radiobutton_demon.pack()
radiobutton_demon.place(x = 20,y = 250)
radiobutton_system.pack()
radiobutton_system.place(x = 20,y = 300)
button_figure1 = Button(root,text = 'Figure1',command = p1)
button_figure2 = Button(root,text = 'Figure2',command = p2)
button_figure3 = Button(root,text = 'Figure3',command = p3)
button_figure1.pack()
button_figure2.pack()
button_figure3.pack()
button_figure1.place(height = 30,width = 100,x = 20,y = 350)
button_figure2.place(height = 30,width = 100,x = 20,y = 400)
button_figure3.place(height = 30,width = 100,x = 20,y = 450)
root.mainloop()
这是程序的代码,一些是根据下一个帖子里面的内容修改的。 这是一个模拟理想气体分子能量与速度变化的程序,我希望能在按下figure1、figure2、figure3之后能把新的图表覆盖在旧的图表上面,要怎么办到? 我用的是python3.2。
ChongQingJin28 2012-12-23
  • 打赏
  • 举报
回复
请问你figure是什么呢?canvas是什么,plot又是什么呢?
有三个figure会怎么样,有三个canvas呢,有三个plot呢?

figure属于canvas吗?plot一定是属于figure的?
c060635 2012-12-23
  • 打赏
  • 举报
回复
我就是看过那个帖子做的。可是现在有3张图表,如果这样写 def p1(): canvas = FigureCanvasTkAgg(figure1,root) canvas.get_tk_widget().pack(anchor = E ,expand=1) canvas.draw() def p2(): canvas = FigureCanvasTkAgg(figure2,root) canvas.get_tk_widget().pack(anchor = E ,expand=1) canvas.draw() def p3(): canvas = FigureCanvasTkAgg(figure3,root) canvas.get_tk_widget().pack(anchor = E ,expand=1) canvas.draw() 那么下一张图表显示出来就跑到上一张的右边了,有没有办法能让新出现的图表显示在上一张的地方呢?
ChongQingJin28 2012-12-23
  • 打赏
  • 举报
回复
你先看看下一个帖子

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧