본문 바로가기

과학/실험 & 활동

[파이썬] 히파르코스 항성 목록 위치 표현 : 3D Scatter

히파르코스 항성 목록을 이용하여 3d scatter를 그려보겠습니다.

 

전체적인 순서는 아래와 같습니다.

1. 3d scatter 맛보기

2. Simbad에서 HIP 항성 자료 다운로드 및 데이터 가공

3. 히파르코스 카달로그 항성 위치 그래프 그리기

 

1. 3D Scatter 맛보기

x, y, z 좌표가 있으면 간단히 3D로 위치를 표현할 수 있습니다. 

우선 관련 라이브러리를 불러옵니다.

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

다음으로 x, y, z 좌표를 설정합니다. 

여기에서는 임의의 좌표를 넣어보겠습니다. 숫자는 원하시는 대로 바꾸셔도 무방합니다.

x=[-7.7, -0.1, 1.9, 5.4, 5.9, 6.3, 6.5, 6.8, 7.3, 7.8, 8.3, 9.3, 10.0, 10.0, 10.9, 11.0, 12.3, 15.0, 17.6, 26.4]
y=[-8.3, 0.0, -2.6, 0.7, 4.3, 3.0, 22.3, 1.6, 0.0, 0.4, 3.3, 1.3, -2.2, 3.5, -2.3, -10.0, -4.0, -0.4, 6.5, -14.6]
z=[-6.3, -8.9, -3.1, -0.5, -0.5, -0.5, 19.7, -1.3, -0.8, -1.1, 2.4, -1.2, 0.6, 1.3, -2.0, -4.2, -3.8, 2.6, -9.1, 17.7]

다음으로는 그래프를 그리기 위한 설정을 합니다. 

마커의 크기와 색상 등은 따로 검색하셔서 다양하게 바꾸셔도 좋습니다.

여기에서 제목 및 축 설정을 하지는 않았지만 최종적으로는 해보겠습니다. 

(잘 아시겠지만 # 뒤에 쓰는 글자는 코딩에 대한 설명입니다. 인식하지 않으니 붙여넣을 때 지울 필요가 없습니다.)

 

fig = plt.figure(figsize=(5, 5))
ax = fig.gca(projection ='3d')
ax.scatter(x,y,z, marker='o', s=15, c='darkgreen') # x, y, z 좌표값 표시 및 마커 설정
ax.scatter(0,0,0, marker='o', s=35, c='red') # 기준점 설정, c=red가 색상 지정
plt.savefig('3dcluster.png', bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

저는 구글 코랩에서 작업을 했기 때문에 이미지 파일이 컴퓨터에 저장되는 것이 아니라 코랩 상의 파일함에 저장됩니다.

결과 화면은 코랩 상에서 바로 확인하고, 우측 클릭하여 저장할 수도 있고, 좌측의 파일함을 클릭한 후 다운로드 받을 수도 있습니다.

코드에서 ax.view_init(15,0) 부분을 추가하면 보는 각도를 바꿀 수 있습니다.

숫자를 다양하게 입력하며 결과를 확인해보면 좋겠습니다.

fig = plt.figure(figsize=(5, 5))
ax = fig.gca(projection ='3d')
ax.view_init(15,0)
ax.scatter(x,y,z, marker='o', s=15, c='darkgreen')
ax.scatter(0,0,0, marker='o', s=35, c='red')
plt.savefig('3dcluster.png', bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

2. Simbad에서 HIP 항성 자료 다운로드 및 데이터 가공

다음으로 SIMBAD에서 필요한 항성 자료를 다운로드하겠습니다.

크롬을 여시고 구글 검색창에 SIMBAD라고 검색합니다. 

제일 처음에 검색되는 홈페이지로 접속한 후 VizieR 탭으로 이동합니다.

(아래 그림에 빨간색 동그라미로 표시된 곳입니다.)

히파르코스 카달로그를 다운받기 위해 검색창에 hipparcos를 치고 find를 누릅니다.

검색 결과 중 가장 위쪽에 있는 항목 I/239/hip main을 선택합니다.

다음에 뜨는 화면에서는 어떤 자료를 다운로드 할 것인지 선택하는 곳입니다. 

우리에게 필요한 정보는 적경과 적위, V등급, 연주시차이므로 나머지 항목은 모두 해제합니다.

단, 적경과 적위는 각도로 표시된 항목을 다운로드해야 합니다. 아래 그림에서 체크할 항목을 표시하겠습니다.

다음으로는 홈페이지의 왼쪽에 세로로 길쭉하게 표시된 항목을 보겠습니다.

여기에서는 다운로드하는 파일의 형식과 다운로드 개수의 최대값 등을 지정합니다. 

우리는 Tab으로 값을 분할한 TSV 파일 형식으로 최대한 많은 항성을 다운로드 하겠습니다.

위 그림에서 max 값으로 unlimited, 그 바로 아래에 Tab-Separated-Values를 선택한 것을 확인하세요.

모든 선택이 끝났으면 화면 오른쪽에 Submit를 눌러 다운로드를 실행합니다.

파일을 저장하는 화면이 뜨는데 편하신 폴더에 저장하면 되겠습니다. 

저는 hip_sample이라는 이름으로 저장했습니다.

저장이 완료된 후 파일을 확인해보시면 연결프로그램이 설정되지 않아 흰 종이처럼 아이콘이 보입니다.

이제 파일을 열고 데이터를 조금 가공해야 합니다. 우선 엑셀을 실행하세요.

엑셀에서 [파일-열기-찾아보기]를 선택한 후 파일 이름 오른쪽에 있는 파일 형식 지정란에서 모든 파일을 선택하면

저장했던 tsv파일이 보입니다. 선택한 후 파일을 열어주시면 텍스트 마법사가 실행되며 아래의 그림처럼 보입니다.

구분 기호로 분리됨이 선택되어 있는데 그대로 놔둔 채 다음을 클릭합니다.

2단계에서는 구분 기호를 설정하는데 가장 위쪽에 있는 탭을 선택한 후(아마도 되어있을 거에요) 다음을 클릭합니다.

마지막 3단계에서도 마침을 누르면 파일이 열립니다.

파일을 열어보시면 # 뒤쪽으로 영어들이 난무하는데 파일에 대한 설명이므로 지워버립니다.

#이 있는 행을 모두 지우고 나면 변소들이 보입니다. 설정할 때 잘못해서 RAJ2000, DEJ2000, B-V라는 변수도 함께 생겼네요. 세 변수와 그 아래쪽에 단위를 표시한 행과 그 바로 밑에 ......으로 표시된 행까지 깔끔하게 지웁니다. 

다 지우고 나면 Vmag, RAICRS, DEICRS, Plx 가 남습니다.

나중에 코딩을 편하게 하기 위해 RAICRS -> RA, DEICRS -> DE로 수정하고 필터까지 씌워주세요.

이제 네 개의 변수가 남았습니다. 마지막 행 번호를 보니 118219네요. 즉, 118218개의 항성 데이터가 있습니다. 

모든 데이터를 쓰면 좋겠지만 항성 데이터가 중간중간 비어있는 상태입니다. 이를 그대로 코딩할 경우 오류가 많이 나고, 파이썬 안에서 수정하면 잘 안되서 엑셀 상에서 수정하겠습니다. 간단히 빈칸이 있는 행은 지우는 작업입니다.

118218개의 데이터를 모두 볼 수는 없으므로 필터 기능을 사용하겠습니다. 

필터 표시의 조그만 역삼각형을 클릭하시면 '숫자 오름차순 정렬'이 보이고 아래쪽으로 쭉 내려가면 데이터 값이 보입니다.

데이터 값에서 '모두 선택'을 체크 해제 하신 후 아래쪽으로 쭉 내려 '필드 값 없음'만 체크하시고 확인을 누르면 말그대로 값이 없는 행만 보이게 됩니다.

그럼 그 행을 지우고, 다시 '모두 선택' 하신 후 다른 변수에 대해서도 같은 작업을 반복합니다. 

하나라도 값이 없으면 쓸 수가 없으므로 확이할 필요도 없이 그냥 쭉 드래그하셔서 행을 삭제해주세요.

이 작업까지 끝나면 코딩을 위한 데이터 가공은 끝난 것입니다. 

마지막으로 코딩 때 쓸 수 있도록 저장하겠습니다. 

엑셀에서 [다른 이름으로 저장]을 클릭한 후 원하는 파일명(영어로)을 쓰시고 파일 형식을 'CSV UTF-8(쉼표로 분리)'를

체크한 후 저장해주세요. 저장한 폴더는 꼭 기억하셔야 합니다.^^

 

3. 히파르코스 카달로그 항성 위치 그래프 그리기

 

다음은 구글 코랩에 접속하신 후 히파르코스 항성 목록을 이용하여 항성의 위치를 3차원에 표시해보겠습니다. 

이 과정은 1에서 한 3D Scatter 맛보기 작업과 거의 유사합니다만, 약간의 천문학적 지식을 동원해야 합니다.

사전 작업으로 구글 코랩의 파일함을 열고 앞에서 저장했던 항성 데이터 파일을 업로드 합니다.

다음은 필요한 라이브러리를 불러옵니다.

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd

코딩을 위해 업로든 한 파일을 불러오겠습니다.

# 항성 파일 불러오기
df_hip = pd.read_csv('hip_star22.csv')

파일이 잘 로딩됐는지 확인합니다. head 명령어를 사용하면 간략하게 데이터를 볼 수 있습니다. 

df_hip.head()

데이터 값의 공란은 없는지도 한 번 확인해보겠습니다.

df_hip.isnull().sum() # 데이터의 공란 값 확인

위에서 보이는 것처럼 모든 변수에 0이 뜨면 공란없이 데이터 가공이 잘 되어있음을 확인할 수 있습니다.

 

파이썬에서는 데이터의 자료형에 따라 계산이 불가능할 수도 있으므로 데이터 타입을 확인해보겠습니다.

df_hip.dtypes # data 타입확인

결과값에 float64라고 뜨는데 자료형이 '실수'라는 의미입니다. 참고로 str은 문자, int는 정수라는 의미입니다.

 

이제 본격적으로 천문학적 지식을 동원해보겠습니다. 

우리는 항성의 적경과 적위, 가시등급(Vmag), 연주시차에 대한 정보를 가지고 있습니다. 

항성의 위치를 표시하기 위해서는 태양으로부터의 거리를 알아야 하므로 연주 시차를 이용해서 

별까지의 거리(r)를 변수로 추가합니다. 

df_hip['r']=1/(df_hip['Plx']/100.) # 별까지의 거리 구해서 변수에 추가하기

위 식은 간단히 연주시차 공식을 이용해서 작성한 것이며 '/100'을 한 이유는 우리가 받은 자료의 연주시차 단위가 "에 100을 나눈 값으로 제공됐기 때문입니다. 연주시차가 워낙 작은 값이라 단위를 그렇게 표시하는 것 같습니다.

 

변수를 추가했으므로 다시 한 번 변수를 확인해보겠습니다. 

단순히 변수만 확인하는 방법도 있고, 앞서 썼던 head를 써도 됩니다.

df_hip.columns # 변수 확인
df_hip.head()

그림을 보시면 없었던 변수 'r'이 생겨난 것을 확인할 수 있습니다. 

 

다음은 가장 중요한 작업입니다. 

항성 데이터에 주어진 적경과 적위의 단위는 각도(degree)이며, 적도좌표계에서는 항성의 거리는 무시하고 모두 천구상에 있다고 가정하므로 이를 3차원으로 표현하기 위해서는 항성의 거리를 반영한 x, y, z 좌표를 만들 필요가 있습니다. 

관련 내용은 기본 천문학에 잘 설명이 되어 있는데 여기에서는 결과적인 식만 쓰겠습니다.

# 적경, 적위를 x,y,z 좌료로 환산하기
x = df_hip['r']*np.cos(df_hip['RA'])*np.cos(df_hip['DE'])
y = df_hip['r']*np.sin(df_hip['RA'])*np.cos(df_hip['DE'])
z = df_hip['r']*np.sin(df_hip['DE'])

위 코드를 보면 x = r*cos[적경]*cos[적위], y = r*sin[적경]*cos[적위], z= = r*sin[적위] 임을 알 수 있습니다. 

 

다음은 첫 번째 과정에서 했던 것과 같이 3D Scatter를 그려주면 됩니다.

fig = plt.figure(figsize=(10, 10))
ax = fig.gca(projection ='3d')
ax.view_init(30,30)
ax.scatter(0,0,0, marker='o', s=35, c='red')
ax.scatter(x,y,z, marker='o', s=15, c='darkgreen')
ax.set_xlabel('x') # x축 이름
ax.set_ylabel('y') # y축 이름
ax.set_zlabel('z') # z축 이름
plt.title('hip star 3D scatter', fontsize=16) # 그래프 제목
plt.savefig('hip star 3D scatter', bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

태양으로부터의 거리로 그린 것이므로 중심에 태양이 있습니다. 

빨간색 마커 표시를 넣었지만 태양 주변으로 너무 많은 별이 모여있어 태양이 보이지 않네요.

이렇게만 보면 마치 태양이 우리 은하의 중심인 것만 같은 착각이 듭니다. 

다음에는 은하 안에서 태양의 위치를 확인할 수 있는 그래프를 한 번 개발해보겠습니다.

오늘 활동은 여기까지입니다. 감사합니다. 

반응형