2013-08-24 4 views
2

파이썬 프로그램은 그래프를 그릴 수 있지만 커브는 비현실적입니다. enter image description hereScipy를 사용하여 사실적인 커브를 플롯하는 방법

어떻게 부드러운-KO 그래프 Scipy를 사용 할 수 있습니다 : 예를 들어

? 이 문제에 관한 이전 튜토리얼을 보았지만 numpy와 arange() 기능을 사용하는 경향이있었습니다. 내 프로그램은 점수가 numpy에서 음모를 꾸미지 않기 때문에이 시나리오에서는 기능이 쓸모가 없다고 생각합니다.

import Tkinter as Tk 
import ttk 
import sympy 
import matplotlib.pyplot as plt 

x = sympy.symbols('x') 

class Interface(ttk.Frame): 
    def __init__(self,parent=None): 
     ttk.Frame.__init__(self,parent) 
     self.parent = parent 
     self.InitUI() 

    def InitUI(self): 
     self.x_from_1 = ttk.Label(self.parent, text= ' X values should be from : ') 
     self.x_from_2 = ttk.Label(self.parent, text = ' To : ') 
     self.x_from_1_inp = ttk.Entry(self.parent) 
     self.x_from_2_inp = ttk.Entry(self.parent) 

     self.equation_label = ttk.Label(self.parent,text = 'Equation : ') 
     self.equation = ttk.Entry(self.parent) 

     self.submit = ttk.Button(self.parent,text='Plot',command= self.Plot) 

# Grid Allocations Here 
     self.x_from_1.grid(column=0,row=0) 
     self.x_from_2.grid(column=5,row=0) 
     self.x_from_1_inp.grid(column=1,row=0) 
     self.x_from_2_inp.grid(column=10,row=0) 

     self.equation_label.grid(column = 0,row=3) 
     self.equation.grid(column=1,row=3,ipadx= 35) 

     self.submit.grid(column=10,row=5) 
# Grid Allocations End Here 


    def Plot(self): 
     x_vals = range(int(self.x_from_1_inp.get()),int(self.x_from_2_inp.get())) 
     eq = eval(self.equation.get()) 
     self.prepare_table(x_vals,eq) 
     plt.plot(x_vals,self.y_values) 
     plt.grid(True) 
     plt.show() 

    def prepare_table(self,x_values,equation): 
     y = [] 
     for i in x_values: 
      y.append(equation.subs(x,i)) 
     self.y_values = y 
     return self.y_values 

root = Tk.Tk() 
root.title('Graphs') 
app = Interface(root) 
app.mainloop() 
+0

당신은 numpy.polyfit''이 데이터에 차를 맞는 수, 그 줄거리. 또는 BioPython에서 LO (W) ESS 구현을 살펴보십시오. –

답변

4

사용 scipy.interpolate.interp1d : scipy.interpolate.interp1d

... 
from scipy.interpolate import interp1d 
import numpy 

class Interface(ttk.Frame): 
    .... 
    def Plot(self): 
     x_vals = range(int(self.x_from_1_inp.get()),int(self.x_from_2_inp.get())) 
     eq = eval(self.equation.get()) 
     self.prepare_table(x_vals,eq) 
     f = interp1d(x_vals, self.y_values, kind='cubic') 
     x_new = numpy.linspace(x_vals[0], x_vals[-1], (x_vals[-1]-x_vals[0])*4) 
     plt.plot(x_new, f(x_new)) 
     plt.grid(True) 
     plt.show() 
+0

그려지는 곡선의 정확도는 무엇에 따라 좌우됩니까? 이 행은 무엇을합니까? x_new = numpy.linspace (x_vals [0], x_vals [-1], (x_vals [-1] -x_vals [0]) * 4)' –

+0

@KDawG, 죄송합니다. 곡선의 정확성에 대해 알고 있어야합니다. 'x''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''의 형태에 따라 달라질 수 있습니다. – falsetru

+1

@KDawG'numpy.linspace (x, y, n)'는'x'와'y' 사이에'n' 숫자를 만듭니다 ('x','y' 포함). 예를 들어,'numpy.linspace (0, 2, 10)'는'[0, 0.5, 1, 1.5, 2]'를 산출합니다. – falsetru

관련 문제