Постройте несколько графиков, используя один и тот же график - PullRequest
0 голосов
/ 11 сентября 2018

Я написал один код, в котором я хочу построить несколько графиков на одном графике.Когда я запускаю это, я не получаю ни результата, ни ошибки.Я пытаюсь взять каждое значение и построить график с помощью программы.Так что я предполагаю иметь 4 графа как 4 элемента.Самое главное, все графики должны быть на одном рисунке.Хотя я не получаю никаких ошибок или результатов, я немного запутался, работает ли цикл for или нет.Когда я использую фиксированное альфа-значение и, без использования цикла 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 голосов
/ 12 сентября 2018

Проблема в том, что вы помещаете команду 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...