【问题标题】:How to plot same function with many different values in subplots in numpy/matplotlib python?如何在 numpy/matplotlib python 的子图中绘制具有许多不同值的相同函数?
【发布时间】:2018-04-26 21:49:56
【问题描述】:

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

  1. 在 1 个(只有一个)图形中绘制相同的函数,该图形具有许多不同的(比如说 4 个)“v0”和“theta”值,每个轨迹都以不同的颜色显示。
  2. 在 4 个不同的图形中绘制 4 个图,使其看起来像一个带有 4 个不同 'v0' 和 'theta' 值的图的正方形
  3. 制作一个小部件以根据用户的需要使用鼠标改变 v0 和 theta 值。

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 值还是什么?

谢谢!

【问题讨论】:

    标签: python numpy matplotlib matplotlib-widget


    【解决方案1】:

    把你的代码变成一个函数:

    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)])
    

    结果如下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      相关资源
      最近更新 更多