如何在numpy / matplotlib python的子图中绘制具有许多不同值的相同函数?

时间:2018-04-26 21:49:56

标签: python numpy matplotlib matplotlib-widget

我有以下python代码,并希望:

  1. 在1(只有一个)图中绘制相同的函数,其中有许多不同的(比方说4)' v0'和' theta'值,每个轨迹用不同的颜色。
  2. 在4个不同的数字中制作4个地块,使其看起来像一个4个不同的' v0'和' theta'值
  3. 制作一个小部件,根据用户的需要改变v0和theta值。
  4. import numpy as np 
    import scipy.integrate as integrate 
    import matplotlib.pyplot as plt 
    %matplotlib inline
    
    
    theta = 45.                   
    theta = theta * np.pi/180.   
    v0 = 20.0
    
    g = 9.81         
    R = 0.035             
    m = 0.057         
    rho = 1.2041           
    C = 0.5                
    
    
    k = (0.5*np.pi*R**2*C*rho)/m    
    
    
    x0=0                 
    y0=10     
    vx0 = v0*np.sin(theta)      
    vy0 =
    v0*np.cos(theta)     
    print(vx0) 
    print(vy0)
    
    def f_func(X_vek,time):
    f = np.zeros(4)    
    f[0] = X_vek[2]    
    f[1] = X_vek[3]    
    f[2] = - k*(f[0]**2 + f[1]**2)**(0.5)*f[0]         
    f[3] = -g - k*(f[0]**2 + f[1]**2)**(0.5)*f[1]      
    return f
    
    X0 = [ x0, y0, vx0, vy0]         
    t0 = 0. tf = 10  
    tau = 0.05    
    
    t = np.arange(t0,tf,tau)   
    
    X = integrate.odeint(f_func,X0,t)    
    
    x = X[:,0]      
    y = X[:,1]  
    vx = X[:,2]  
    vy = X[:,3]
    
    mask = y >= 0    
    
    plt.scatter(x[mask],y[mask]) 
    plt.scatter(x[mask],y[mask])
    plt.xlabel('x') plt.ylabel('y') plt.show()
    

    我可以通过在绘图后更改值来完成我的问题的第1点和第2点,然后再次计算vx0和vy0,然后调用积分函数并最终重新绘制,但这有点奇怪而且不干净。有没有更好的方法呢?像一个不同的v0和theta值的数组或什么?

    谢谢!

1 个答案:

答案 0 :(得分:0)

将您的代码设为函数:

def func(theta=45, v0=20):
    theta = theta * np.pi/180.   

    g = 9.81         
    R = 0.035             
    m = 0.057         
    rho = 1.2041           
    C = 0.5                

    k = (0.5*np.pi*R**2*C*rho)/m    

    x0=0                 
    y0=10     
    vx0 = v0*np.sin(theta)      
    vy0 = v0*np.cos(theta)     

    def f_func(X_vek,time):
        f0, f1 = X_vek[2:4].tolist()
        f2 = - k*(f0**2 + f1**2)**(0.5)*f0         
        f3 = -g - k*(f0**2 + f1**2)**(0.5)*f1      
        return [f0, f1, f2, f3]

    X0 = [ x0, y0, vx0, vy0]         
    t0 = 0. 
    tf = 10  
    tau = 0.05    

    t = np.arange(t0,tf,tau)   
    X = integrate.odeint(f_func,X0,t)    

    x = X[:,0]      
    y = X[:,1]  
    vx = X[:,2]  
    vy = X[:,3]
    mask = y >= 0    
    return x[mask], y[mask]

然后你可以用不同的参数绘制它:

plt.plot(*func()) 
plt.plot(*func(theta=30)) 

plt.xlabel('x')
plt.ylabel('y')
plt.show()

我建议您使用Holoviews制作动态图表:

import holoviews as hv
hv.extension("bokeh")

hv.DynamicMap(
    lambda theta, v0:hv.Curve(func(theta, v0)).redim.range(x=(0, 50), y=(0, 50)), 
    kdims=[hv.Dimension("theta", range=(0, 80), default=40), 
           hv.Dimension("v0", range=(1, 40), default=20)])

结果如下:

enter image description here