繁体   English   中英

在matplotlib中绘图

[英]Plotting in 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()

根据我的代码,我假设所有内容(Fz, Z, v , time)都有99个值。 当我打印时,我可以看到所有值,但是当我尝试使用相互之间不同的参数绘制它们以进行分析时,却从未得到任何图形。 谁能告诉我,代码中缺少解释的内容是什么?

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

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

内部循环:

Z.append(Z [-1] + v * dt)#新位置

循环后:

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

没时间测试它,希望能奏效...

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

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

请注意,在您的示例中,您实际上并没有一系列随机数,而是为一个固定种子抽取了一个固定数,因此该图并没有真正意义(它似乎在产生一条直线)。 为了正确地解释您的意图,您可能需要一系列与时间序列一样长的随机数。 使用np.random.normal最容易做到这np.random.normal

还有许多其他方法可以优化您的代码。 例如,在numpy中也可以找到math模块中的所有数学函数,因此您根本无法导入math pandas 另外,您可以在for循环中定义一些常数值,这些常数值可以在循环之前进行一次计算。 最后,@AnttiA可能是正确的,你想要timex轴和Zy轴。 因此,我生成了两个曲线图-在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()

结果看起来像这样:

以上代码的结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM