在matplotlib中绘图

时间:2018-01-18 23:23:02

标签: python numpy matplotlib

我写了以下代码,

import numpy as np
from random import gauss
from random import seed
from pandas import Series
import matplotlib.pyplot as plt 
import math
###variable declaration
R=0.000001 #radiaus of particle
beta=0.23 # shape factor
Ad=9.2#characteristic nanoscale defect area
gamma=4*10**-2 #surface tension
tau=.0001 #line tension

phi=-(math.pi/2)#spatial perturbation
lamda=((Ad)/(2*3.14*R)) #averge contcat line position

mu=0.001#viscosity of liquid
lamda_m=10**-9# characteristic size of adsorption site
KbT=(1.38**-24)*293 # boltzman constant with tempartaure
nu=0.001#moleculer volume in liquid phase 1
khi=3 #scaling factor
#deltaF=(beta*gamma*Ad)#surface energy perturbation
deltaF=19*KbT
# seed random number generator
seed(0)
# create white noise series
series = [gauss(0.0, 1.0) for i in range(1)]
series = Series(series)
#########################################
Z=0.0000001 #particle position
time=1
dt=1
for time in np.arange(1, 100, dt):
#####simulation loop#######
    theta=np.arccos(-Z/R) #contact angle
    theta_e=((math.pi*110)/180) #equilibrium contact angle
    Z_e=-R*np.cos(theta_e)#equilibrium position of particle
    C=3.14*gamma*(R-Z_e) #additive constant
    Fsz= (gamma*math.pi*(Z-Z_e)**2)+(tau*2*math.pi*math.sqrt(R**2-Z**2))+C
    Fz=Fsz+(0.5*deltaF*np.sin((2*math.pi/lamda)*(Z-Z_e)-phi))#surface force
    #dFz=(((gamma*Ad)/2)*np.sin(2*math.pi/lamda))+((Z-Z_e)*(2*gamma*math.pi))-((tau*2*math.pi*Z)/(math.sqrt(R**2-Z**2)))
    dFz=(deltaF*np.sin(2*math.pi/lamda))+((Z-Z_e)*(2*gamma*math.pi))-((tau*2*math.pi*Z)/(math.sqrt(R**2-Z**2)))
    w_a=gamma*lamda_m**2*(1-np.cos(theta_e)) #work of adhesion
    epsilon_z=2*math.pi*R*np.sin(theta)*mu*(nu/(lamda_m**3))*np.exp(w_a/KbT)#transitional drag
    epsilon_s=khi*mu*((4*math.pi**2*R**2)/math.sqrt(Ad))*(1-(Z/R)**2)
    epsilon=epsilon_z+epsilon_s
    Ft=math.sqrt(2*KbT*epsilon)*series #thermal force
    v=(dFz+Ft)/epsilon ##new velocity
    Z=Z+v*dt #new position    
    print('z=',Z)
    print('v=',v)
    print('Fz=',Fz)
    print('dFz',dFz)
    print('time',time)    
plt.plot(Z,time)
plt.show()

根据我的代码,我想假设有99个值(Fz, Z, v , time)。当我打印时,我可以看到所有的值,但是当我试图用不同的参数绘制它们以进行分析时,我从来没有得到任何图形。任何人都可以告诉我,我的代码中缺少什么解释?

2 个答案:

答案 0 :(得分:1)

我想,无论如何你都会得到情节,y值可能是94到104。 现在你用一点绘制线条。它的长度为零,这就是为什么你看不到它,试试:plt.plot(Z,time,' *')。 现在你应该在中间找到带有星号的图形 正如Thomas建议的那样,您应该使用数组而不是使用最后计算的值。如果您更喜欢循环(有时它们更容易修改),请修改线条...
在循环之前:

  

Z = [0.0000001]#初始化Z为时间0
  time_vec = np.arange(1,100,dt)

内圈:

  

Z.append(Z [-1] + v * dt)#new position

循环后:

  

plt.plot(Z [1:],time_vec)

没时间测试它,希望有效...

请注意,plot命令中的第一个参数是x轴值,第二个是y轴,我喜欢x轴上的时间。

答案 1 :(得分:1)

@AnttiA的答案基本上是正确的,但很容易被误解,从OP的评论中可以看出。因此,这里改变了完整的代码,以便实际产生图。不要将Z作为列表,而是将另一个变量定义为列表,例如Z_all = [],然后将更新的Z - 值附加到该列表中。对time变量也可以这样做,即time_all = np.arange(1,100,dt)。最后,将plot命令从循环中取出并立即绘制整个数据系列。

请注意,在您的示例中,您实际上没有一系列随机数,您为一个固定种子提取一个固定数字,因此该绘图实际上没有意义(它似乎产生一条直线)。试图正确地解释你的意图,你可能想要一系列与你的时间序列一样长的随机数。使用np.random.normal

可以轻松完成此操作

还有很多其他方法可以优化您的代码。例如,math模块中的所有数学函数也可以在numpy中找到,因此您根本不能导入mathpandas也是如此。此外,您在for - 循环内定义了一些常量值,可以在循环之前计算一次。最后,@ AnttiA可能是正确的,您需要time轴上的xZ轴上的y。因此,我生成了两个图 - 左边是Z的时间,右边是Z。现在终于改变了代码:

import numpy as np
#from random import gauss
#from random import seed
#from pandas import Series
import matplotlib.pyplot as plt 
#import math

###variable declaration
R=0.000001 #radiaus of particle
beta=0.23 # shape factor
Ad=9.2#characteristic nanoscale defect area
gamma=4*10**-2 #surface tension
tau=.0001 #line tension

phi=-(np.pi/2)#spatial perturbation
lamda=((Ad)/(2*3.14*R)) #averge contcat line position

mu=0.001#viscosity of liquid
lamda_m=10**-9# characteristic size of adsorption site
KbT=(1.38**-24)*293 # boltzman constant with tempartaure
nu=0.001#moleculer volume in liquid phase 1
khi=3 #scaling factor
#deltaF=(beta*gamma*Ad)#surface energy perturbation
deltaF=19*KbT


##quantities moved out of the for-loop:
theta_e=((np.pi*110)/180) #equilibrium contact angle
Z_e=-R*np.cos(theta_e)#equilibrium position of particle
C=3.14*gamma*(R-Z_e) #additive constant
w_a=gamma*lamda_m**2*(1-np.cos(theta_e)) #work of adhesion

#########################################
Z=0.0000001 #particle position
##time=1
dt=1

Z_all = []
time_all = np.arange(1, 100, dt)
# seed random number generator
# seed(0)
np.random.seed(0)
# create white noise series
##series = [gauss(0.0, 1.0) for i in range(1)]
##series = Series(series)
series = np.random.normal(0.0, 1.0, len(time_all))

for time, S in zip(time_all,series):
#####simulation loop#######
    Z_all.append(Z)
    theta=np.arccos(-Z/R) #contact angle
    Fsz= (gamma*np.pi*(Z-Z_e)**2)+(tau*2*np.pi*np.sqrt(R**2-Z**2))+C
    Fz=Fsz+(0.5*deltaF*np.sin((2*np.pi/lamda)*(Z-Z_e)-phi))#surface force
    #dFz=(((gamma*Ad)/2)*np.sin(2*np.pi/lamda))+((Z-Z_e)*(2*gamma*np.pi))-((tau*2*np.pi*Z)/(np.sqrt(R**2-Z**2)))
    dFz=(deltaF*np.sin(2*np.pi/lamda))+((Z-Z_e)*(2*gamma*np.pi))-((tau*2*np.pi*Z)/(np.sqrt(R**2-Z**2)))
    epsilon_z=2*np.pi*R*np.sin(theta)*mu*(nu/(lamda_m**3))*np.exp(w_a/KbT)#transitional drag
    epsilon_s=khi*mu*((4*np.pi**2*R**2)/np.sqrt(Ad))*(1-(Z/R)**2)
    epsilon=epsilon_z+epsilon_s
    Ft=np.sqrt(2*KbT*epsilon)*S #series #thermal force
    v=(dFz+Ft)/epsilon ##new velocity
    Z=Z+v*dt #new position    
    print('z=',Z)
    print('v=',v)
    print('Fz=',Fz)
    print('dFz',dFz)
    print('time',time)    


fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(8,4))

axes[0].plot(Z_all,time_all)
axes[0].set_xlabel('Z')
axes[0].set_ylabel('t')

axes[1].plot(time_all, Z_all)
axes[1].set_xlabel('t')
axes[1].set_ylabel('Z')

fig.tight_layout()

plt.show()

结果如下:

result of above code