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