2012-09-06 60 views
-1

這是我一直在研究的程序,我已經在這裏得到了一些很好的故障排除技巧。如何讓matplotlib重繪軸

它運行得很好,而且速度是不是主要的問題,因爲它只是應該給在圖形如何用不同變化的輸入改變一個直觀的樣子。但是,我怎樣才能將圖形完全渲染到REDRAW上,而不僅僅是線條(它將每個軸重新繪製在舊圖形的頂部而沒有清除它,因此它會堆積起來並迅速陷入停滯狀態)。

謝謝大家!

#!/usr/apps/Python/bin/python 
import matplotlib, sys 
matplotlib.use('TkAgg') 
from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
from Tkinter import * 
import math 
from matplotlib import pylab 
import scipy 
from scipy.stats import norm 


master = Tk() 
master.title("DePaul University Interactive Options Graphs") 

pricePlot = Figure(figsize=(4,3), dpi=100, frameon=False) 
a = pricePlot.add_subplot(111) 
a.set_title('The Greeks') 
priceDataPlot = FigureCanvasTkAgg(pricePlot, master=master) 
priceDataPlot.get_tk_widget().grid(column=1, columnspan=2, row=1, rowspan=2) 

vegaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False) 
b = vegaPlot.add_subplot(1,1,1) 
b.set_title('Vega') 
vegaDataPlot = FigureCanvasTkAgg(vegaPlot, master=master) 
vegaDataPlot.get_tk_widget().grid(row=2) 

deltaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False) 
c = deltaPlot.add_subplot(111) 
c.set_title('Delta') 
deltaDataPlot = FigureCanvasTkAgg(deltaPlot, master=master) 
deltaDataPlot.get_tk_widget().grid(row=0,rowspan=2) 

gammaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False) 
d = gammaPlot.add_subplot(111) 
d.set_title('Gamma') 
gammaDataPlot = FigureCanvasTkAgg(gammaPlot, master=master) 
gammaDataPlot.get_tk_widget().grid(column=3,row=2) 

rhoPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False) 
e = rhoPlot.add_subplot(111) 
e.set_title('Rho') 
rhoDataPlot = FigureCanvasTkAgg(rhoPlot, master=master) 
rhoDataPlot.get_tk_widget().grid(column=3,row=3) 

thetaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False) 
f = thetaPlot.add_subplot(111) 
f.set_title('Theta') 
thetaDataPlot = FigureCanvasTkAgg(thetaPlot, master=master) 
thetaDataPlot.get_tk_widget().grid(column=3,row=0,rowspan=2) 

a3Plot = Figure(figsize=(4,3.5), dpi=75, frameon=False) 
g = a3Plot.add_subplot(111) 
g.set_title('Price') 
a3DataPlot = FigureCanvasTkAgg(a3Plot, master=master) 
a3DataPlot.get_tk_widget().grid(row=3) 


CallPutFlag='c' 

def changePut(): 
    CallPutFlag='p' 
    print CallPutFlag 

def changeCall(): 
    CallPutFlag='c' 
    print CallPutFlag 


def main(): 

    T=250         # This will 
    timeSpread = range(T-200,T+200,20) # all be user 
              # inputted 
              # values through 
              # Tkinter GUI 
              # 
              # JV 7/27/2012 

    r=float(interestRate.get()) 
    S=float(stockPrice.get()) 
    K=float(strikePrice.get()) 
    v=float(volatility.get()) 




    def BlackScholes(t): 

      d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365))) 
      d2 = d1-v*math.sqrt((float(t)/365)) 

      if CallPutFlag=='c': 

        return S*scipy.stats.norm.cdf(d1)-K*math.exp(-r*float(t))*scipy.stats.norm.cdf(d2) 

      else: 

        return K*math.exp(-r*float(t))*scipy.stats.norm.cdf(-d2)-S*scipy.stats.norm.cdf(-d1) 


    def delta(t): 

      d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365))) 
      d2 = d1-v*math.sqrt((float(t)/365)) 

      if CallPutFlag=='c': 
        callDelta = scipy.stats.norm.cdf(d1) 

        return callDelta 

      else: 
        putDelta = -scipy.stats.norm.cdf(-d1) 

        return putDelta 

    def gamma(t): 

      d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365))) 
      d2 = d1-v*math.sqrt((float(t)/365)) 
      gamma = scipy.stats.norm.pdf(d1)/(S*v*math.sqrt(float(t))) 

      return gamma 

    def rho(t): 
      d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365))) 
      d2 = d1-v*math.sqrt((float(t)/365)) 

      if CallPutFlag=='c': 
        callRho = (K*t*scipy.stats.norm.cdf(d2)/100)*math.e**-(r*t) 

        return callRho 

      else: 
        putRho = (-K*t*scipy.stats.norm.cdf(-d2)/100)*math.e**-(r*t) 

        return putRho 

    def vega(t): 
      d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365))) 

      return S*scipy.stats.norm.pdf(d1)*math.sqrt(float(t))/100 

    def theta(t): 

     d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365))) 
     d2 = d1-v*math.sqrt((float(t)/365)) 
     b = math.e**-(r*t) 

     if CallPutFlag=='c': 

       callTheta = -S*scipy.stats.norm.pdf(d1)*v/(2*math.sqrt(float(t))-r*K*b*scipy.stats.norm.cdf(d2)) 

       return callTheta 

     else: 
       putTheta = -S*scipy.stats.norm.pdf(d1)*v/(2*math.sqrt(float(t))+r*K*b*scipy.stats.norm.cdf(-d2)) 

       return putTheta 


    tprices = [BlackScholes(i) for i in timeSpread] 
    tdeltas = [delta(i) for i in timeSpread] 
    tgammas = [gamma(i) for i in timeSpread] 
    trhos = [rho(i) for i in timeSpread] 
    tvegas = [vega(i) for i in timeSpread] 
    tthetas = [theta(i) for i in timeSpread] 

    a.cla() 
    a.plot(timeSpread,tdeltas,'g-') 
    a.plot(timeSpread,tgammas,'b-') 
    a.plot(timeSpread,trhos,'m-') 
    a.plot(timeSpread,tvegas,'r-') 
    a.plot(timeSpread,tthetas,'c-') 
    priceDataPlot.show() 

    line, = b.plot(timeSpread,tvegas,'r-') 
    vegaDataPlot.show() 
    line.remove() 

    line, = c.plot(timeSpread,tdeltas,'g-') 
    deltaDataPlot.show() 
    line.remove() 

    line, = d.plot(timeSpread,tgammas,'b-') 
    gammaDataPlot.show() 
    line.remove() 

    line, = e.plot(timeSpread,trhos,'m-') 
    rhoDataPlot.show() 
    line.remove() 

    line, = f.plot(timeSpread,tthetas,'c-') 
    thetaDataPlot.show() 
    line.remove() 

    line, = g.plot(timeSpread,tprices,'k-') 
    a3DataPlot.show() 
    line.remove() 


##photo=PhotoImage(file='/Users/jaredvacanti/Desktop/Depaul.gif') 
##Label(master, image=photo).grid() 

w = Label(master, text="DePaul University Department of Finance \nInteractive Options Graphs") 
w.grid(row=0,column=1,columnspan=2,pady=100) 

r1 = Radiobutton(master, variable=CallPutFlag, value='c', text="Call",command=lambda root=master:main()) 
r2 = Radiobutton(master, variable=CallPutFlag, value='p', text="Put",command=lambda root=master:main()) 
r1.grid(row=0,column=1,columnspan=2,pady=50, sticky=N) 
r2.grid(row=0,column=1,columnspan=1,pady=50, sticky=N) 


interestRate = Scale(master, from_=0, to=5,orient=HORIZONTAL,label='Interest Rate', command=lambda root=master:main()) 
interestRate.set(1) 
interestRate.grid(row=3,column=2) 
stockPrice = Scale(master, from_=0, to=100,orient=HORIZONTAL,label='Stock Price', command=lambda root=master:main()) 
stockPrice.set(10.0) 
stockPrice.grid(row=3,column=1,pady=10) 
strikePrice = Scale(master, from_=0, to=100,orient=HORIZONTAL,label='Strike Price', command=lambda root=master:main()) 
strikePrice.set (11.0) 
strikePrice.grid(row=3,rowspan=2,column=1,sticky=N) 
volatility = Scale(master, from_=0, to=10,orient=HORIZONTAL,label='Volatility', command=lambda root=master:main()) 
volatility.set(1) 
volatility.grid(row=3,rowspan=2,column=2,sticky=N) 


def quit(master): 
    master.destroy() 

Button(master, borderwidth=0, bg='gray', text="Quit", command=lambda root=master:quit(master)).grid(row=3,rowspan=2,column=2,sticky=S,pady=30) 
Button(master, borderwidth=0, bg='gray', text="Calculate").grid(row=3,rowspan=2, column=1,columnspan=1,sticky=S,pady=30) 


main() 
master.mainloop() 
+1

你會介意將事情分解爲更簡潔的例子嗎?作爲一個更直接的答案,發生的情況是您每次都要添加一個新行,而不是更新現有行的數據。嘗試使用'line.set_data(...)'而不是每次調用'plot'。 –

回答

1

刪除frameon=False時創建的圖對象:

Figure(figsize=(4,3), dpi=100) 

如果你想圖的背景顏色是一樣的Tk的窗口中,您可以通過facecolor aurgument設置:

Figure(figsize=(4,3), dpi=100, facecolor=TK_BACKGROUND_COLOR) 

在我的系統上:

TK_BACKGROUND_COLOR = (212.0/256,208.0/256,200.0/256)