使用GUI加速或优化Python matplotlib

时间:2014-10-06 23:57:18

标签: python-3.x numpy matplotlib tkinter anaconda

我放在一起的代码设法完成工作(打开文件,解释数据,绘制结果),但matplotlib窗口非常慢。当我运行没有GUI(tkinter)的代码版本时,速度更快。我是否已经在实现tkinter类中做了一些事情来减慢速度?或者这只是使用GUI的副作用?

顺便说一下,我主要是自学成才,所以对一般风格的反馈也很受欢迎。

以下是代码:

import numpy as np
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from matplotlib import pyplot as plt

class App(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)        
        tk_lowcut = tk.StringVar()
        tk_highcut = tk.StringVar()
        tk_filename = tk.StringVar()
        tk_lowcut.set(30)
        tk_highcut.set(60)

        def getfilename():
            filename = askopenfilename()
            tk_filename.set(filename)              

        def plot():            
            def csv_reader(file_obj):
                A = np.genfromtxt(file_obj, delimiter=',' , skip_header=3)
                t = A[ : ,0]
                a = A[ : ,1]
                return A, t, a;

            def f_domain(channel_a):
                f_t = np.fft.fft(channel_a)
                return f_t;

            def f_freq(size,step):
                f_f = np.fft.fftfreq(size, d=step)
                return f_f;

            def bandpass(signal, W, low, high):
                cut_f_signal = signal.copy()
                cut_f_signal[(W<low)] = 0
                cut_f_signal[(W>high)] = 0
                cut_signal = np.fft.ifft(cut_f_signal)
                return cut_f_signal, cut_signal;

            plt.clf()

            f_obj = tk_filename.get()
            A, t, signal = csv_reader(f_obj)
            lowcut = np.float(tk_lowcut.get())
            highcut = np.float(tk_highcut.get())
            f_signal = f_domain(signal)
            freq = f_freq(t.size, t[2]-t[1])
            cut_f_signal, cut_signal = bandpass(f_signal, freq, lowcut, highcut)  

            fig = plt.figure(1)
            fig.suptitle(f_obj, fontsize=18, family='monospace',
                     weight='bold', color='blue')

            plt.subplot(2,2,1)
            plt.scatter(t,signal)
            plt.title('Raw Time Domain')
            plt.axis([-0.07,4,-350,350])

            plt.subplot(2,2,3)
            plt.scatter(freq,20*np.log10(np.abs(f_signal)))
            plt.title('Raw Frequency Domain')
            plt.axis([0,9000,0,140])

            plt.subplot(2,2,4)
            plt.scatter(freq,20*np.log(np.abs(cut_f_signal)))
            plt.title('Filtered Frequency Domain')
            plt.axis([20,50,150,300])

            plt.subplot(2,2,2)
            plt.scatter(t,cut_signal)
            plt.title('Filtered Time Domain')
            plt.axis([-0.07,4,-350,350])

            plt.show()

        content = ttk.Frame(self, padding=(5,5,12,12))
        content.grid()


        ttk.Button(content,text='Choose Data File',command=getfilename).grid(column=0,
             row=1, columnspan=4, sticky=(tk.E,tk.W), padx=5, pady=5)
        tk.Label(content, text='Low Cut:').grid(column=0, row=0)
        low_entry = tk.Entry(content, width=7, textvariable=tk_lowcut)
        low_entry.grid(column=1, row=0)
        tk.Label(content, text='High Cut:').grid(column=2, row=0)
        high_entry = tk.Entry(content, width=7, textvariable=tk_highcut)
        high_entry.grid(column=3, row=0)
        tk.Label(content, textvariable=tk_filename).grid(row=2, columnspan=4)
        ttk.Button(content,text='Plot',command=plot).grid(column=0,
             row=3, columnspan=4, sticky=(tk.E,tk.W), padx=5, pady=5)

def main():
    root = tk.Tk()
    root.wm_title('Data Plotter')
    App(root).grid()
    root.mainloop()

if __name__== "__main__":
    main()    

0 个答案:

没有答案