【问题标题】:How to embed a matplotllib histogram onto a tkinter GUI?如何将 matplotlib 直方图嵌入 tkinter GUI?
【发布时间】:2014-03-03 03:08:51
【问题描述】:

我有这个程序,它根据特定参数(上限、样本大小)内随机生成的数字的中位数列表创建直方图。我怎样才能使创建的直方图出现在 tkinter GUI 中,就在比例尺上方?我到处寻找,仍然无法弄清楚。提前致谢!我正在使用 python 3。

额外问题(无需回答,但如果您愿意,它会有所帮助):我将如何做到这一点,以便比例控制 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()

【问题讨论】:

    标签: python user-interface python-3.x matplotlib


    【解决方案1】:

    创建一个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,而是使用Figure对象f

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

    顺便说一句,幻灯片网格稍作修改以获得上述结果:

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

    【讨论】:

    • 非常感谢!比我在其他地方看到的要容易得多。
    • @JosueValverde,顺便说一句,它不交互。如果您需要交互,则需要更多代码。查看完整源代码:pastebin.com/SJMPEtDg
    • @JosueValverde,另请参阅 matplotlib 站点中的 user_interfaces example code: embedding_in_tk.py
    • ,嗯,我明白了!您可以给我任何指导以使比例与 number_lists 交互吗?特别添加到直方图,因为我只能让它在当前的顶部绘制一个直方图。感谢您的所有帮助!
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2019-01-31
    • 2018-08-19
    • 2018-06-14
    相关资源
    最近更新 更多