使用同一图形绘制多个图形

时间:2018-09-11 20:54:53

标签: python python-3.x numpy matplotlib

我编写了一个代码,希望在同一图中绘制多个图形。运行此命令时,没有任何结果或任何错误。我正在尝试使用该程序获取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()

1 个答案:

答案 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()

输出

enter image description here