2014-03-03 3 views
2

특정 매개 변수 (상한, 표본 크기) 내에서 무작위로 생성 된 숫자의 중앙값 목록에서 막대 그래프를 만드는이 프로그램이 있습니다. 생성 된 히스토그램이 눈금 바로 위의 tkinter GUI에 나타나도록하려면 어떻게해야합니까? 나는 도처에서 보았지만 여전히 그것을 파악할 수는 없다. 미리 감사드립니다! 나는 파이썬 3을 사용하고있다.matplotllib 히스토그램을 tkinter GUI에 삽입하는 방법은 무엇입니까?

보너스 질문 (답할 필요는 없지만 원한다면 1 톤 도움이된다.) : 어떻게 스케일이 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 객체를 생성하고, 프레임 안에 넣어 대신 plt 사용 중, main에서

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

를 사용도 개체 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

BTW, 위의 결과를 얻으려면 슬라이드 그리드가 약간 수정되었습니다.

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

관련 문제