Python 在matplotlib中绘图

Python 在matplotlib中绘图,python,numpy,matplotlib,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

我写了下面的代码

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)
。当我打印时,我可以看到所有的值,但是当我试图用不同的参数来绘制它们以供分析时,我从来没有得到任何图形。有人能告诉我,我的代码中缺少了什么并加以解释吗?

我想,不管怎样,您都会得到绘图,y值可能在94到104之间。 现在您正在用一个点绘制直线。它的长度是零,这就是为什么您看不到它,请尝试:plt.plot(Z,time,“*”)。 现在你应该在中间得到一个ASTIX图形。 正如Thomas所建议的,您应该使用数组,而不是使用上次计算的值。如果您喜欢循环(有时它们更容易修改),请修改行…
循环前:

Z=[0.0000001]#初始化时间为0的Z
时间向量=np.arange(1100,dt)

内部循环:

附加(Z[-1]+v*dt)#新位置

循环后:

plt.plot(Z[1:],time_-vec)

没有时间测试它,希望能工作


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

我想,您无论如何都会得到plot,y轴值可能在94到104之间。 现在您正在用一个点绘制直线。它的长度是零,这就是为什么您看不到它,请尝试:plt.plot(Z,time,“*”)。 现在你应该在中间得到一个ASTIX图形。 正如Thomas所建议的,您应该使用数组,而不是使用上次计算的值。如果您喜欢循环(有时它们更容易修改),请修改行…
循环前:

Z=[0.0000001]#初始化时间为0的Z
时间向量=np.arange(1100,dt)

内部循环:

附加(Z[-1]+v*dt)#新位置

循环后:

plt.plot(Z[1:],time_-vec)

没有时间测试它,希望能工作


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

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

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

还有很多其他方法可以优化代码。例如,
math
模块中的所有数学函数也可以在
numpy
中找到,因此您根本无法导入
math
。熊猫也是如此。此外,您还可以在
中为
-循环定义一些常量值,这些常量值可以在循环之前计算一次。最后,@AnttiA可能是对的,您希望
时间
位于
x
轴上,而
Z
位于
y
轴上。因此,我生成了两个曲线图——左边的时间曲线图和右边的时间曲线图。现在,最后修改代码:

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()
结果如下所示:


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

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

还有很多其他方法可以优化代码。例如,
math
模块中的所有数学函数也可以在
numpy
中找到,因此您根本无法导入
math
。熊猫也是如此。此外,您还可以在
中为
-循环定义一些常量值,这些常量值可以在循环之前计算一次。最后,@AnttiA可能是对的,您希望
时间
位于
x
轴上,而
Z
位于
y
轴上。因此,我生成了两个曲线图——左边的时间曲线图和右边的时间曲线图。现在,最后修改代码:

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()
结果如下所示:


我认为您的缩进是错误的——现在您只绘制for循环的最后一个
Z
time
值。不管怎么说,不需要深入研究你的数学,我认为你可以不用
for
循环使用
numpy
来完成整个过程。变量
系列
用于什么?我看不到它在任何地方被使用。@ThomasKühn变量序列被用来产生随机噪声。它用于计算FtI我认为您的缩进是错误的——现在您只绘制for循环的最后一个
Z
time
值。不管怎样,wi