공부하는 북극성

[양자화학, 파이썬] matplotlib를 이용하여 수소원자의 선 스펙트럼 그리기(라이먼, 발머, 파셴) 본문

나누는 삶/수업자료

[양자화학, 파이썬] matplotlib를 이용하여 수소원자의 선 스펙트럼 그리기(라이먼, 발머, 파셴)

북극성 ✰ 2023. 9. 11. 15:41
728x90
반응형

 

들어가며

학생들과 양자 파트의 수업을 하면서 개념확인을 위한 자료들이 필요해졌다. 
뤼드베리 공식을 이용하여 보어의 수소원자 모형에 의해 방출되는 수소 원자의 선 스펙트럼을 이해하는 건데, 
파장과 에너지 사이의 관계를 가볍게 이해했으면 하는 바람으로 개념확인을 시켜주고 싶었다. 
 
그런데, 참^^... 발머 계열은 선 스펙트럼 그림들이 많이 있는데 
라이먼 계열과 파셴, 브래킷 계열은 깔끔한 그림이 없는 것이다. 
 
결국 내가 그리기로 했다. 
오비탈 모양 그리기 하면서,
'검색만 잘하면 된다' 와 '모르면 애들한테 물으면 된다' 라는 것을 깨닫게 되면서 
도전하게 되었다. 
 
matplotlib 의 막대그래프를 이용하여 그려보았음. 
내 아이디어의 한계는 이게 끝인데,
더 좋게 표현할 수 있는 방법이 있다면 댓글로 아이디어 공유 부탁드립니다. 
 
여튼,
어떤 누군가에게는 도움이 되길 바라며! 
 
 
 

결과물

 
내가 주목한 포인트는 
 

1. 파장 간격이 실제 파장 간격과 일치할 것
2. 발머 계열의 경우, 실제 가시광선 파장과 색상이 일치할 것. 

 
이 두 가지를 맞추기 위해 ㅎㅎ..
코딩의 ㅋ도 모르는 나는 열심히 검색을 했더랬다. 
 
 
코딩은 jupyter notebook 에서 했음.
(우리 애들은 구글 코랩이나 IDLE 쓰는 것 같았음.
난 요즘은  vs code 쓰는 중. )
 
matplotlib  깔아놓고 시작하자. 
 
 
 

코드 공유

0. 계열 공통

 
모든 계열 파장에 대해 이 코드를 공통으로 앞에 넣고, 만들고 싶은 계열의 것을 그 뒤에 붙여 넣으면 된다. 

import plotly.graph_objects as go
import matplotlib as mpl
import matplotlib.pyplot as plt

 
 

1. 라이먼 계열

#라이먼계열
Ly = [121.6, 102.5, 97.2, 94.9, 93.7, 93.0, 92.6, 92.3, 92.1]
y = 0.1

plt.style.use('default')

fig=plt.figure(figsize=(100,10), alpha=1 )

ax = fig.add_subplot()
ax.patch.set_facecolor('black')

plt.title("Lyman Spectrum",fontsize=80, pad=50)
plt.xlabel('wavelength(nm)',fontsize=80)
plt.bar(Ly,y,color='skyblue', width=0.05)

ticklabel=['121.6', '102.5', '97.2', '94.9', '93.7', '93.0', '92.6', '92.3', '92.1']
plt.xticks(Ly,ticklabel)

plt.gca().axes.yaxis.set_visible(False)
plt.tick_params(axis='y', left=False)
plt.tick_params(axis='x', labelsize=80, pad=50)

plt.xlim(93.5,122)
plt.show()

 
 

2. 발머계열

#발머계열
Ba = [410, 434, 486,656]
y = 0.1

plt.style.use('default')
fig=plt.figure(figsize=(100,10))
ax = fig.add_subplot()
ax.patch.set_facecolor('black')
plt.title("Balmer Spectrum",fontsize=80, pad=50)
plt.xlabel('wavelength(nm)',fontsize=80)
plt.bar(Ba,y,color=['#6700b4', '#2600f0', '#00eeff', '#f30000'], width=0.5)

ticklabel=['410', '434', '486','656']
plt.xticks(Ba,ticklabel)

plt.gca().axes.yaxis.set_visible(False)
plt.tick_params(axis='y', left=False)
plt.tick_params(axis='x', labelsize=80, pad=50)

plt.xlim(400,700)
plt.show()

 
 

3. 파셴계열

#파셴계열
Pa = [820.14, 954,1005,1093,1281,1875]
y = 0.1

plt.style.use('default')
fig=plt.figure(figsize=(100,10))
ax = fig.add_subplot()
ax.patch.set_facecolor('black')
plt.title("Paschen Spectrum",fontsize=80, pad=50)
plt.xlabel('wavelength(nm)',fontsize=80)
plt.bar(Pa,y,color='pink', width=1.2)

ticklabel=['820.14', '954','1005', '1093', '1281' , '1875']
plt.xticks(Pa,ticklabel)

plt.gca().axes.yaxis.set_visible(False)
plt.tick_params(axis='y', left=False)
plt.tick_params(axis='x', labelsize=80, pad=50)

plt.xlim(810,1900)
plt.show()

 

 
 

코드 변경하기

1. 각각의 파장을 바꾸고 싶다면 

Ly = [121.6, 102.5, 97.2, 94.9, 93.7, 93.0, 92.6, 92.3, 92.1]
Ba = [410, 434, 486,656]
Pa = [820.14, 954,1005,1093,1281,1875]

이 부분에 원하는 파장을 넣어주면 된다. 
 
 
 

2. 타이틀 크기와 제목을 바꾸고 싶다면 

plt.title("Balmer Spectrum",fontsize=80, pad=50)
plt.xlabel('wavelength(nm)',fontsize=80)

여기서 "Balmer Spectrum" 이라고 적힌 부분에서 제목을 바꿔줄 수 있고. 
fontsize = 80 이라고 된 부분의 숫자를 통해 제목 사이즈를 바꿔줄 수 있다. 
pad = 50 은 그래프에서 얼마나 떨어져있느냐의 문제있데, 봐 가면서 숫자를 키워주면 그래프와 점점더 멀어지는 것을 볼 수 있다. 
 
plt.xlabel()  은 x 축의 이름이다. 이도, '' 안의 내용을 바꿔주면 된다. 
 
 
 
 

3. 그래프 배경색(현재 검정)이 마음에 들지 않는다면

ax = fig.add_subplot()
ax.patch.set_facecolor('black')

facecolor('black') 에서 '' 사이를 바꿔주면 된다. 
hex 코드를 이용하면 더 다양한 색상 사용이 가능하다. 
 
 
 

4. x 축 눈금 라벨을 바꿔야한다면 

ticklabel=['410', '434', '486','656']
plt.xticks(Ba,ticklabel)

여기서 ticklabel 안의 숫자를 바꿔주면 된다. 
브래킷 계열로 바꾼다면 저 안의 숫자를 바꿔주면 된다. 
 
1번과 다르게 꼭 '' 안에 적어주어야 하는데,
1번에서의 표시될 눈금 같은 경우에는 숫자로 인식하기 위함이고 
4번에서는 이를 문자로서 인식하여 표시해주기 위함이다. 
 
 

5. 막대의 색상과 두께를 바꾸고 싶다면

plt.bar(Ba,y,color=['#6700b4', '#2600f0', '#00eeff', '#f30000'], width=0.5)

여기서 막대 순서대로 색상을 입력해줘도 되고 

plt.bar(Pa,y,color='pink', width=1.2)

냅다 하나의 색상으로 통일해줘도 된다. 
 
color 앞에는 인식할 눈금 인수를 넣어줘야하므로,
1번에서 본인이 Ly 로 설정했는지, Ba로 설정했는지, Pa 로 설정했는지에 따라 따로 넣어주면 된다. 
 
 width 를 통해 두께를 바꿔줄 수 있다. 
x축 스케일에 따라 같은 두께라도 다르게 보일 수 있으니 봐가면서 바꿔주면 된다. 
 
 

5. 보여줄 x축 범위를 제한하려면

plt.xlim(810,1900)

여기서 제한해주면 됨. 
 
나는 Paschen 계열은 820~1875 가 반드시 보여야 해서 
조금 여유를 두고 820, 1900 으로 설정했다. 
이건 자기 맘대로 설정하면 됨. 
 
 

6. 전체 그래프의 크기와 비율은 

fig=plt.figure(figsize=(100,10))

figsize 안의 숫자를 변경하면 된다. 
나는 가로:세로 = 10:1 로 설정함. 
 
 
 
 
 

나오며

처음 임용되었을 때 한창 뜨던 메이커 교육이라는 단어가 
그때는 전혀- 와닿지 않았는데 
이제는 왜 메이커 교육을 도입했는지 알 것 같다. 
필요할 때 내가 만들어 사용할 수 있다는 것이 얼마나 멋지고 짜릿한 일인지 알게 되어 버렸다. 
 
나같이 무언가 필요하여 직접 만들어 써야하는 누군가를 위해 
하나씩 공유해나가려고 한다. 
 
물론 나의 배움 일지이기도 하고^^... 
 
언제나 더 나아가는 교사가 되기 위하여 
아이들이 더 행복한 그날을 위하여 
 
 
 
 

참고한 사이트

파장을 칼라로 변환하기 
https://rhaoslikesan.tistory.com/468

 

파장을 칼라로 변환하기 (Wavelength to RGB color) (1/2)

진동수 혹은 파장별로 RGB칼라를 변환할 일이 있었다. 쉽게 찾을 수 있을거라 생각했는데 쉽지 않았다. 간단한 공식이 있거나 파장별 RGB테이블이 있을거라 생각했는데. 해서, 정리해 봤다. 약 2주

rhaoslikesan.tistory.com

RGB 코드를 HEX 코드로 변환하기
https://hi098123.tistory.com/132#f30000

 

RGB <-> HEX 색상코드 확인

RGB R G B HEX # 색상 미리보기 URL으로 색상 공유하기 RGB, Hex 색상코드 확인 툴 이 툴은 웹에서 간단하게 RGB와 HEX코드로 적힌 색상을 시각적으로 확인하고 값을 확인해볼수 있는 툴입니다. RGB값은 각

hi098123.tistory.com

 
 
+++ 
혹시 선생님들 중에 코드 쓰는 것 자체가 어렵고 그렇게까지 하고 싶지 않다, 그림만 구하고 싶다! 
하시면, 댓글 남겨주세요. 
메일로 보내드리겠습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형