我编写了一个代码,希望在同一图中绘制多个图形。运行此命令时,没有任何结果或任何错误。我正在尝试使用该程序获取a的每个值并绘制图形。所以我想有4个图,因为有4个元素。最重要的是,所有图形都应在同一图中。尽管我没有收到任何错误或任何结果,但是对于for循环是否正常工作还是有些困惑。当我使用固定的alpha值并且不使用for循环时,我的代码可以完美运行。知道如何执行吗?如果我的问题不清楚,请告诉我。
import numpy as np
import matplotlib.pyplot as plt
r=10**-6
a=np.array([10,30,60,90])
E=[]
B=[]
gamma_sa=58.6*10**-3
gamma_sw=25*10**-3
gamma_pa=153*10**-3
gamma_pw=110*10**-3
gamma_aw=72.5*10**-3
kt= 1.38*10**-23*290
i=0
for n in a:
alpha=n*(np.pi/180)
while i<360:
beta=(90-i)*(np.pi/180)
if i>=alpha*180/np.pi and i<=180-alpha*180/np.pi:
Energy= 2*np.pi*r**2*(gamma_pw+gamma_sw*np.cos(alpha)+gamma_sa*(1-np.cos(alpha))-0.5*gamma_aw*np.sin(alpha)**2)
elif i>=180+alpha*180/np.pi and i<=360-alpha*180/np.pi:
Energy=2*np.pi*r**2*(gamma_sw+gamma_pw*(np.cos(alpha))+gamma_pa*(1-np.cos(alpha))-0.5*gamma_aw*np.sin(alpha)**2)
elif i>180-alpha*180/np.pi and i<180+alpha*180/np.pi :
x=np.arcsin(((1/np.tan(-beta))*(1/np.tan(alpha))))
w=np.cos(alpha)
y=np.arctan((np.cos(-beta))/(np.sqrt((np.sin(beta)**2)-(np.cos(alpha)**2))))
z= (2*r**2)*((x*w)-y)
A_pa= (np.pi*r**2)*(1-np.cos(alpha))+z
A_sa=(2*np.pi*r**2)*(1-np.cos(alpha))-A_pa
A_sw=(2*np.pi*r**2)-A_sa
A_pw=(2*np.pi*r**2)-A_pa
Energy= (gamma_sa*A_sa)+(gamma_pa*A_pa)+(gamma_sw*A_sw)+(gamma_pw*A_pw)-(np.pi*r**2*gamma_aw*np.sin(alpha)**2)
else:
x=np.arcsin(((1/np.tan(beta))*(1/np.tan(alpha))))
w=np.cos(alpha)
y=np.arctan((np.cos(beta))/(np.sqrt((np.sin(beta)**2)-(np.cos(alpha)**2))))
z= (2*r**2)*((x*w)-y)
A_pa= (np.pi*r**2)*(1-np.cos(alpha))+z
A_sa=(2*np.pi*r**2)*(1-np.cos(alpha))-A_pa
A_sw=(2*np.pi*r**2)-A_sa
A_pw=(2*np.pi*r**2)-A_pa
Energy= (gamma_sa*A_sa)+(gamma_pa*A_pa)+(gamma_sw*A_sw)+(gamma_pw*A_pw)-(np.pi*r**2*gamma_aw*np.sin(alpha)**2)
orientation=i
i=i+0.1
E.append(Energy/kt)
B.append(orientation)
plt.figure(1)
plt.title('Change of surface energy with rotation')
plt.plot(B,E)
plt.grid (axis='both')
plt.xlabel(r'$90^0 $ - $\beta $')
plt.ylabel(r'E($\alpha $)/kT')
plt.show()
答案 0 :(得分:0)
问题是您将plot命令放在for
循环之外,因此不会绘制4条曲线。此外,您的一些变量需要重新定义。以下是有效的解决方案(没有if else
语句):
import numpy as np
import matplotlib.pyplot as plt
# r, a, 5 gamma values and kt here
fig = plt.figure(figsize=(8, 6))
for n in a:
i = 0
E=[]
B=[]
alpha=n*(np.pi/180)
while i<360:
# Code here
.
.
.
Energy= (gamma_sa*A_sa)+(gamma_pa*A_pa)+(gamma_sw*A_sw)+(gamma_pw*A_pw)-(np.pi*r**2*gamma_aw*np.sin(alpha)**2)
orientation=i # Mind the indent. Should be outside elif
i=i+0.1
E.append(Energy/kt)
B.append(orientation)
plt.plot(B,E, label='$%d^o$'%n) # Mind the indentation here. Should be outside the while loop
plt.title('Change of surface energy with rotation')
plt.grid (axis='both')
plt.xlabel(r'$90^0 $ - $\beta $')
plt.ylabel(r'E($\alpha $)/kT')
plt.legend()
plt.tight_layout()
输出