공부하는 북극성
[양자화학, 파이썬] matplotlib를 이용하여 수소원자의 선 스펙트럼 그리기(라이먼, 발머, 파셴) 본문
들어가며
학생들과 양자 파트의 수업을 하면서 개념확인을 위한 자료들이 필요해졌다.
뤼드베리 공식을 이용하여 보어의 수소원자 모형에 의해 방출되는 수소 원자의 선 스펙트럼을 이해하는 건데,
파장과 에너지 사이의 관계를 가볍게 이해했으면 하는 바람으로 개념확인을 시켜주고 싶었다.
그런데, 참^^... 발머 계열은 선 스펙트럼 그림들이 많이 있는데
라이먼 계열과 파셴, 브래킷 계열은 깔끔한 그림이 없는 것이다.
결국 내가 그리기로 했다.
오비탈 모양 그리기 하면서,
'검색만 잘하면 된다' 와 '모르면 애들한테 물으면 된다' 라는 것을 깨닫게 되면서
도전하게 되었다.
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
+++
혹시 선생님들 중에 코드 쓰는 것 자체가 어렵고 그렇게까지 하고 싶지 않다, 그림만 구하고 싶다!
하시면, 댓글 남겨주세요.
메일로 보내드리겠습니다.
'나누는 삶 > 수업자료' 카테고리의 다른 글
[산염기적정, 파이썬] matplotlib를 이용하여 PASCO pH meter로 얻은 적정곡선에서 당량점 pH 구하기 (산점도의 변곡점 구하기)(24.7.13.수정) (0) | 2024.06.23 |
---|---|
[양자화학, 파이썬] plotly를 이용한 혼성 오비탈, 혼성 궤도함수 3D plot, 109.5˚의 이유 (1) | 2023.11.05 |
[학생실험] 온도에 따른 황산구리(Ⅱ) 수용액의 전기분해 속도 (0) | 2023.09.03 |
[양자화학, 파이썬] matplotlib를 이용하여 궤도함수 별 가리움 효과를 설명하기 위한 확률 밀도 함수 그래프 그리기 (1) | 2023.08.12 |
<중3 과학> 귀의 구조, 코의 구조, 혀의 구조, 피부의 구조/감각기관의 구조/귀의 구조 수업활동 예시 (8) | 2021.09.06 |