2015-11-08 97 views
4

使用Matplotlib,我想得到一個連接多個點的圖。繪圖命令在for循環內。現在,我每個人都得到一個數字,並且必須關閉第一個數字才能打開第二個數字。在for循環中繪圖,在matplotlib中有'hold'效果?

的預期效果顯示在這個圖形圖像: enter image description here

每個點是偶數N.

如何做到這一點通過修改我當前的Python代碼?最重要的作品是最後的4行,和第一個for循環對7號線

代碼:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import odeint 

y = 5 
x = 2 
for N in range(x,x+y,2): 
    #Constants and parameters 
    epsilon = 0.01 
    K00 = np.logspace(0,3,10,10) 
    len1 = len(K00) 
    y0 = [0]*(3*N/2+3) 
    Kplot = np.zeros((len1,1)) 
    Pplot = np.zeros((len1,1)) 
    S = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
    KS = [np.zeros((len1,1)) for kkkk in range(N/2)] 
    PS = [np.zeros((len1,1)) for kkkk in range(N/2)] 
    Splot = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
    KSplot = [np.zeros((len1,1)) for kkkk in range(N/2)] 
    PSplot = [np.zeros((len1,1)) for kkkk in range(N/2)] 

    for series in range(0,len1): 
     K0 = K00[series] 
     Q = 10 
     r1 = 0.0001 
     r2 = 0.001 
     a = 0.001 
     d = 0.001 
     k = 0.999 
     S10 = 1e5 
     P0 = 1 
     tf = 1e10 
     time = np.linspace(0,tf,len1) 

     #Defining dy/dt's 
     def f(y,t): 
      for alpha in range(0,(N/2+1)): 
       S[alpha] = y[alpha] 
      for beta in range((N/2)+1,N+1): 
       KS[beta-N/2-1] = y[beta] 
      for gamma in range(N+1,3*N/2+1): 
       PS[gamma-N-1] = y[gamma] 
      K = y[3*N/2+1] 
      P = y[3*N/2+2] 

      # The model equations 
      ydot = np.zeros((3*N/2+3,1)) 
      B = range((N/2)+1,N+1) 
      G = range(N+1,3*N/2+1) 
      runsumPS = 0 
      runsum1 = 0 
      runsumKS = 0 
      runsum2 = 0 

      for m in range(0,N/2): 
       runsumPS = runsumPS + PS[m] 
       runsum1 = runsum1 + S[m+1] 
       runsumKS = runsumKS + KS[m] 
       runsum2 = runsum2 + S[m] 
       ydot[B[m]] = a*K*S[m]-(d+k+r1)*KS[m] 

      for i in range(0,N/2-1): 
       ydot[G[i]] = a*P*S[i+1]-(d+k+r1)*PS[i] 

      for p in range(1,N/2): 
       ydot[p] = -S[p]*(r1+a*K+a*P)+k*KS[p-1]+d*(PS[p-1]+KS[p]) 

      ydot[0] = Q-(r1+a*K)*S[0]+d*KS[0]+k*runsumPS 
      ydot[N/2] = k*KS[N/2-1]-(r2+a*P)*S[N/2]+d*PS[N/2-1] 
      ydot[G[N/2-1]] = a*P*S[N/2]-(d+k+r2)*PS[N/2-1] 
      ydot[3*N/2+1] = (d+k+r1)*runsumKS-a*K*runsum2 
      ydot[3*N/2+2] = (d+k+r1)*(runsumPS-PS[N/2-1])- \ 
          a*P*runsum1+(d+k+r2)*PS[N/2-1] 

      ydot_new = [] 
      for j in range(0,3*N/2+3): 
       ydot_new.extend(ydot[j]) 
      return ydot_new 

     # Initial conditions 
     y0[0] = S10 
     for i in range(1,3*N/2+1): 
      y0[i] = 0 
     y0[3*N/2+1] = K0 
     y0[3*N/2+2] = P0 

     # Solve the DEs 
     soln = odeint(f,y0,time, mxstep = 5000) 
     for alpha in range(0,(N/2+1)): 
      S[alpha] = soln[:,alpha] 
     for beta in range((N/2)+1,N+1): 
      KS[beta-N/2-1] = soln[:,beta] 
     for gamma in range(N+1,3*N/2+1): 
      PS[gamma-N-1] = soln[:,gamma] 

     for alpha in range(0,(N/2+1)): 
      Splot[alpha][series] = soln[len1-1,alpha] 
     for beta in range((N/2)+1,N+1): 
      KSplot[beta-N/2-1][series] = soln[len1-1,beta] 
     for gamma in range(N+1,3*N/2+1): 
      PSplot[gamma-N-1][series] = soln[len1-1,gamma] 

     u1 = 0 
     u2 = 0 
     u3 = 0 

     for alpha in range(0,(N/2+1)): 
      u1 = u1 + Splot[alpha] 
     for beta in range((N/2)+1,N+1): 
      u2 = u2 + KSplot[beta-N/2-1] 
     for gamma in range(N+1,3*N/2+1): 
      u3 = u3 + PSplot[gamma-N-1] 

     K = soln[:,3*N/2+1] 
     P = soln[:,3*N/2+2] 
     Kplot[series] = soln[len1-1,3*N/2+1] 
     Pplot[series] = soln[len1-1,3*N/2+2] 
     utot = u1+u2+u3 

    #Plot 
    Kcrit = abs((Q/r2)*(1+epsilon)-utot) 
    v,i = Kcrit.min(0),Kcrit.argmin(0) 
    plt.plot(N,K00[i]) 
    plt.show() 

感謝您的幫助。

回答

2

如果我是正確的,你只需要一個點,你所計算的所有點。如果是這樣的話,最簡單的方法就是存儲所有的點並將它們全部繪製在最後。所以我會做什麼。需要創建兩個列表來存儲數據x_data_plot和y_data_plot。所以變化將是:

在每次循環的商店創建列表

# The data of the plot will be added in these lists 
x_data_plot=[] 
y_data_plot=[] 

Store中的數據

# Save the new points for x and y 
x_data_plot.append(N) 
y_data_plot.append(K00[i]) 

最後使得情節

# Make the plot of all the points together 
plt.plot(x_data_plot,y_data_plot) 
plt.show() 

放在一起

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import odeint 

y = 5 
x = 2 
# The data of the plot will be added in these lists 
x_data_plot=[] 
y_data_plot=[] 
for N in range(x,x+y,2): 
    #Constants and parameters 
    epsilon = 0.01 
    K00 = np.logspace(0,3,10,10) 
    len1 = len(K00) 
    y0 = [0]*(3*N/2+3) 
    Kplot = np.zeros((len1,1)) 
    Pplot = np.zeros((len1,1)) 
    S = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
    KS = [np.zeros((len1,1)) for kkkk in range(N/2)] 
    PS = [np.zeros((len1,1)) for kkkk in range(N/2)] 
    Splot = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
    KSplot = [np.zeros((len1,1)) for kkkk in range(N/2)] 
    PSplot = [np.zeros((len1,1)) for kkkk in range(N/2)] 

    for series in range(0,len1): 
     K0 = K00[series] 
     Q = 10 
     r1 = 0.0001 
     r2 = 0.001 
     a = 0.001 
     d = 0.001 
     k = 0.999 
     S10 = 1e5 
     P0 = 1 
     tf = 1e10 
     time = np.linspace(0,tf,len1) 

     #Defining dy/dt's 
     def f(y,t): 
      for alpha in range(0,(N/2+1)): 
       S[alpha] = y[alpha] 
      for beta in range((N/2)+1,N+1): 
       KS[beta-N/2-1] = y[beta] 
      for gamma in range(N+1,3*N/2+1): 
       PS[gamma-N-1] = y[gamma] 
      K = y[3*N/2+1] 
      P = y[3*N/2+2] 

      # The model equations 
      ydot = np.zeros((3*N/2+3,1)) 
      B = range((N/2)+1,N+1) 
      G = range(N+1,3*N/2+1) 
      runsumPS = 0 
      runsum1 = 0 
      runsumKS = 0 
      runsum2 = 0 

      for m in range(0,N/2): 
       runsumPS = runsumPS + PS[m] 
       runsum1 = runsum1 + S[m+1] 
       runsumKS = runsumKS + KS[m] 
       runsum2 = runsum2 + S[m] 
       ydot[B[m]] = a*K*S[m]-(d+k+r1)*KS[m] 

      for i in range(0,N/2-1): 
       ydot[G[i]] = a*P*S[i+1]-(d+k+r1)*PS[i] 

      for p in range(1,N/2): 
       ydot[p] = -S[p]*(r1+a*K+a*P)+k*KS[p-1]+d*(PS[p-1]+KS[p]) 

      ydot[0] = Q-(r1+a*K)*S[0]+d*KS[0]+k*runsumPS 
      ydot[N/2] = k*KS[N/2-1]-(r2+a*P)*S[N/2]+d*PS[N/2-1] 
      ydot[G[N/2-1]] = a*P*S[N/2]-(d+k+r2)*PS[N/2-1] 
      ydot[3*N/2+1] = (d+k+r1)*runsumKS-a*K*runsum2 
      ydot[3*N/2+2] = (d+k+r1)*(runsumPS-PS[N/2-1])- \ 
          a*P*runsum1+(d+k+r2)*PS[N/2-1] 

      ydot_new = [] 
      for j in range(0,3*N/2+3): 
       ydot_new.extend(ydot[j]) 
      return ydot_new 

     # Initial conditions 
     y0[0] = S10 
     for i in range(1,3*N/2+1): 
      y0[i] = 0 
     y0[3*N/2+1] = K0 
     y0[3*N/2+2] = P0 

     # Solve the DEs 
     soln = odeint(f,y0,time, mxstep = 5000) 
     for alpha in range(0,(N/2+1)): 
      S[alpha] = soln[:,alpha] 
     for beta in range((N/2)+1,N+1): 
      KS[beta-N/2-1] = soln[:,beta] 
     for gamma in range(N+1,3*N/2+1): 
      PS[gamma-N-1] = soln[:,gamma] 

     for alpha in range(0,(N/2+1)): 
      Splot[alpha][series] = soln[len1-1,alpha] 
     for beta in range((N/2)+1,N+1): 
      KSplot[beta-N/2-1][series] = soln[len1-1,beta] 
     for gamma in range(N+1,3*N/2+1): 
      PSplot[gamma-N-1][series] = soln[len1-1,gamma] 

     u1 = 0 
     u2 = 0 
     u3 = 0 

     for alpha in range(0,(N/2+1)): 
      u1 = u1 + Splot[alpha] 
     for beta in range((N/2)+1,N+1): 
      u2 = u2 + KSplot[beta-N/2-1] 
     for gamma in range(N+1,3*N/2+1): 
      u3 = u3 + PSplot[gamma-N-1] 

     K = soln[:,3*N/2+1] 
     P = soln[:,3*N/2+2] 
     Kplot[series] = soln[len1-1,3*N/2+1] 
     Pplot[series] = soln[len1-1,3*N/2+2] 
     utot = u1+u2+u3 

    #Plot 
    Kcrit = abs((Q/r2)*(1+epsilon)-utot) 
    v,i = Kcrit.min(0),Kcrit.argmin(0) 
    # Save the new points for x and y 
    x_data_plot.append(N) 
    y_data_plot.append(K00[i]) 

# Make the plot of all the points together 
plt.plot(x_data_plot,y_data_plot) 
plt.show() 

這將導致: Example of result

如果你想有一個DINAMIC圖像是liitle更復雜,但它是可能的。只是要求它。

+0

謝謝。這正是我想要的! – abscissa

+0

你是什麼意思的動態圖像? – abscissa

+0

@abscissa我的意思是某種動畫。因此,您將從空白圖像開始,並在計算新值時添加到圖中。當你執行腳本時,你會選擇一個空的圖形,點將逐一出現。最後,您將得到與答案中的腳本完全相同的情節。 –