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()
非常感謝!比我在其他地方看到的要容易得多。 –
@JosueValverde,BTW它不會相互作用。如果您需要交互,則需要更多代碼。查看完整的源代碼:http://pastebin.com/SJMPEtDg – falsetru
@JosueValverde,另請參閱matplotlib中的[user_interfaces示例代碼:embedding_in_tk.py](http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html)現場。 – falsetru