본문 바로가기
파이썬으로 배우는 지구과학

파이썬을 이용하여 광물의 절대 굳기 그래프 그리기

by 0대갈장군0 2021. 5. 21.
반응형

모스는 대표광물 10가지를 상대적인 단단한 정도를 가지고 구분하였다. 이를 상대굳기라고 하며, 대표광물 10가지의 종류는 단단해지는 순서로 활석, 석고, 방해석, 형석, 인회석, 정장석, 석영, 황옥, 강옥, 금강석이다.

모스굳기의 1~10의 숫자는 어디까지나 단단함의 순서일 뿐 절대 단단함이 아니다. 예를들어 석고의 모스굳기는 2, 형석의 모스굳기는 4인데, 형석이 석고보다 2배 더 단단함을 의미하는것이 아니다. 실제 단단한 정도는 절대 굳기로 나타낸다.

반응형

아무튼 여기서는 광물의 절대굳기를 파이썬을 이용해 그래프로 표현해 보고자 한다.

필요한 라이브러리는 그래프를 그릴 때 많이 사용하는 matplotlib이다.

아래와 같이 라이브러리를 호출하자

 

import matplotlib.pyplot as plt

 

다음으로 2개의 리스트형 자료를 만든다. 변수를 a, b로 지정하고, a에는 광물의 이름을, b에는 광물의 절대굳기를 넣는다.

 

a=['talcum','gypsum','calcite','fluorite','apatite','orthoclase','quartz','topaz','corundum','diamond']
b=[1,2,9,21,48,72,100,200,400,1500]

 

광물명을 영어로 썼다. 파이썬은 기본적으로 한글을 알아먹지 못해 오류가 뜬다. 한글 패키지를 설치하면 되기야 하지만, 필자는 그냥 영어로 쓴다. talcum에서 diamond까지 순서대로 활석, 석고, 방해석, 형석, 인회석, 정장석, 석영, 황옥, 강옥, 금강석이다.

리스트 b의 숫자는 절대굳기로, 리스트 a의 광물명의 순서대로 대응한다고 생각하면 된다.

a, b 리스트를 생성하였으니 이제 그래프만 그리면 된다.

 

matplotlib.pyplot를 plt로 호출하였다. 따라서

 

plt.plot(a,b)

plt.show()

라고 호출하면 아래와 같은 그래프가 뜬다.

다른거야 그렇다 치더라도 x축의 광물 이름이 겹쳐 보여 보기 좋지 않다. 글자가 너무 길어서 그러니 보기 좋게 x축 글자를 회전해 보자. plt.plot(a,b) 다음에 아래와 같이 작성하면 된다.

 

plt.xticks(rotation=45)

 

전체 코드는 아래와 같다.

import matplotlib.pyplot as plt
a=['talcum','gypsum','calcite','fluorite','apatite','orthoclase','quartz','topaz','corundum','diamond']
b=[1,2,9,21,48,72,100,200,400,1500]

plt.plot(a,b)

plt.xticks(rotation=45)

plt.show()

 

plt.xticks(rotation=45)에서 xticks는 x축에 변화를 주는 함수이며, 그 중 x축 라벨을 회전하기 위해 rotation이라는 함수를 넣었다. 여기서는 45도를 회전하기 위해 45라고 썼는데 이는 회전하고 싶은 숫자 만큼을 넣어주면 된다. xticks라는 모듈에는 회전 이외에도 여러가지 모듈이 있는데, 이는 그때그때 설명하기로 하고... 어쨌든 위와같이 코드를 짜면

위의 바탕은 너무 많고 아래 x축 라벨이 일부 잘린다. 이를 해결하기 위해 아래와 같은 코드를 입력하자.

plt.tight_layout(pad=0.5)

 

전체 코드는 아래와 같다.

import matplotlib.pyplot as plt
a=['talcum','gypsum','calcite','fluorite','apatite','orthoclase','quartz','topaz','corundum','diamond']
b=[1,2,9,21,48,72,100,200,400,1500]

plt.plot(a,b)

plt.xticks(rotation=45)

plt.tight_layout(pad=0.5)

plt.show()

 

그럼 아래처럼 이쁘게 나올것이다.

그래도 좀 마음에 안든다. y축의 0 아래는 불필요한 공간이니 없애버리자. 이때 y축의 범위를 지정해 주면 된다.

그리고 그래프의 이름이 없어서 마음에 들지 않는다. 그래프의 이름도 지어주자.

 

y축의 범위는

plt.ylim(0,1500)으로 지정해 주는데, 최소값은 0, 최대값은 1500으로 하라는 소리이다.

그래프의 제목은 

plt.title("Mohs' scale of mineral hardness") 라고 써 주면 된다. ""안에 있는 것이 그래프의 제목이다. 최종 코드는 아래와 같다. 여기서 주의할점은, plt.tight_layout을 맨 마지막에 지정해 주어야 한다는 점이다. 그렇지 않으면 그래프가 잘린다.

 

import matplotlib.pyplot as plt
a=['talcum','gypsum','calcite','fluorite','apatite','orthoclase','quartz','topaz','corundum','diamond']
b=[1,2,9,21,48,72,100,200,400,1500]
plt.plot(a,b)
plt.xticks(rotation=45)
plt.title("Mohs' scale of mineral hardness")
plt.ylim(0,1500)

plt.tight_layout(pad=0.5)
plt.savefig('C:\\Users\\kalch\\Desktop\\hardness.png',dpi=300)  ## 그래프를 저장하는 코드
plt.show()

 

마지막에 plt.savefig는 그래프를 이미지 파일로 저장하는 코드이며, dpi=300은 화질의 품질 쯤으로 생각하면 된다.(해상도는 아니다. 자세한 설명은 나중에...)

이제 마지막으로 그래프의 x축과 y축의 이름을 붙여보자. 아래와 같은 xlabel과 ylabel 코드를 이용하면 된다.

plt.xlabel('mineral name')
plt.ylabel('absolute hardness')

이 코드를 plt.tight_layout(pad=0.5) 바로 전에 입력해 주면 된다.

 

최종적인 코드는 아래와 같고, 아래 그래프가 출력된다.

 

import matplotlib.pyplot as plt
a=['talcum','gypsum','calcite','fluorite','apatite','orthoclase','quartz','topaz','corundum','diamond']
b=[1,2,9,21,48,72,100,200,400,1500]
plt.plot(a,b)
plt.xticks(rotation=45)
plt.title("Mohs' scale of mineral hardness")
plt.ylim(0,1500)
plt.xlabel('mineral name')
plt.ylabel('absolute hardness')
plt.tight_layout(pad=0.5)
plt.savefig('C:\\Users\\kalch\\Desktop\\hardness.png',dpi=300)
plt.show()

 

반응형

댓글