2014-03-03 397 views
2

我有這個程序可以根據特定參數(上限,樣本大小)中隨機生成的數字的中位數列表創建直方圖。我怎樣才能讓它創建的直方圖出現在tkinter的圖形用戶界面中,就在這個尺度上方?我到處尋找,仍然無法弄清楚。提前致謝!我正在使用Python 3.如何將matplotllib直方圖嵌入到tkinter GUI中?

獎金的問題(無需回答,但如果你想它會幫助噸):我該如何使它的規模控制number_lists(這基本上是數字的中位數生成次數),然後通過添加新的計算中位數來更新直方圖的外觀?

import random 
import matplotlib, sys 
matplotlib.use('TkAgg') 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
import matplotlib.pyplot as plt 
import matplotlib.mlab as mlab 
import numpy as np 
from tkinter import * 
from tkinter import ttk 


#root 
root = Tk() 
root.title("Sample Size and the Normal Distribution") 

#mainframe 
mainframe = ttk.Frame(root, padding = "3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

def create_list(sampleSize, upperLimit): 
    numbList = [] 
    sampleSize = int(sample.get()) 
    upperLimit = int(upper.get()) 
    while sampleSize > 0: 
     sampleSize -= 1 
     randomNum = random.randrange(0,upperLimit+1) 
     numbList.append(randomNum) 
    numbList.sort(key=int) 
    return numbList 

def medians_variance(median_list): 
    sum_of_medians = sum(median_list) 
    variance = sum_of_medians/len(median_list) 
    return variance 


def median(numbList): 

     srtd = sorted(numbList) 
     mid = len(numbList)//2 
     if len(numbList) % 2 == 0: 
      return (srtd[mid-1] + srtd[mid])/2.0 
     else: 
      return srtd[mid] 


def main(): 

    number_lists = 10 
    lists = [] 
    median_list = [] 

    binsize = 10 

    for i in range(number_lists): 
     lists.append(create_list(sampleSize, upperLimit)) 

    for current_list in lists: 
     current_median = median(current_list) 
     median_list.append(current_median) 
     median_list.sort(key=float) 


    plt.hist(median_list, binsize) 

    plt.xlabel('Median Value', fontsize = 15) 
    plt.ylabel('Frequency', fontsize = 15) 

    plt.show() 


    med = median(median_list) 
    std = np.std(median_list) 
    var = (std**2) 


#sampleSize Entry 
sample = StringVar() 
sampleSize = ttk.Entry(mainframe, width = 7, textvariable = sample) 
sampleSize.grid(column = 2, row = 1, sticky =(W, E)) 

#upperLimit Entry 
upper = StringVar() 
upperLimit = ttk.Entry(mainframe, width = 7, textvariable = upper) 
upperLimit.grid(column = 2, row = 3, sticky = (W, E)) 

#binsize Entry 
Bin = StringVar() 
binsize = ttk.Entry(mainframe, width = 7, textvariable = Bin) 
binsize.grid(column = 2, row = 5, sticky = (W, E)) 

#sampleSize and upperLimit Labels 
ttk.Label(mainframe, text="Sample Size ").grid(column = 1, row = 1, sticky = W) 
ttk.Label(mainframe, text="Upper Limit ").grid(column = 1, row = 3, sticky = W) 
ttk.Label(mainframe, text="Bin Size").grid(column = 1, row = 5, sticky = W) 

#histogram embed 
f = Figure(figsize = (5,4), dpi=100) 

#button for new histogram 
button = ttk.Button(mainframe, text="New Histogram", command=main).grid(column=1, row=7, sticky=W) 

#scale 
scale = Scale(mainframe, from_=0, to=10, orient=HORIZONTAL,length=400).grid(column = 5, row = 12, sticky= S) 

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) 

sampleSize.focus() 
upperLimit.focus() 
root.bind('<Return>', main) 

root.mainloop() 

回答

3

創建FigureCanvasTkAgg對象,並把它在框架內部:

f = Figure(figsize=(5,4), dpi=100) 
canvas = FigureCanvasTkAgg(f, master=mainframe) 
canvas.get_tk_widget().grid(row=1, column=3, rowspan=6) 

main,代替使用plt,使用圖對象f

p = f.gca() 
p.hist(median_list, binsize) 
p.set_xlabel('Median Value', fontsize = 15) 
p.set_ylabel('Frequency', fontsize = 15) 
canvas.show() 

enter image description here

順便說一下,滑動網格稍微修改,以獲得以上結果:

scale = Scale(mainframe, from_=0, to=10, orient=HORIZONTAL,length=400) 
scale.grid(column=3, row=12, sticky=S) 
+0

非常感謝!比我在其他地方看到的要容易得多。 –

+0

@JosueValverde,BTW它不會相互作用。如果您需要交互,則需要更多代碼。查看完整的源代碼:http://pastebin.com/SJMPEtDg – falsetru

+0

@JosueValverde,另請參閱matplotlib中的[user_interfaces示例代碼:embedding_in_tk.py](http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html)現場。 – falsetru

相關問題