MapleStory Finger Point

Development/Graph

Polar Plot (자유자재로) 그리기

吳鍾振 2020. 9. 9. 22:22

파이썬으로 Polar Plot을 그리고 싶은데, 대부분의 자료들이 함수를 적용해서 정확히 어떻게 실행되는지를 모르겠다.

그냥 정리 겸 공부하는 느낌으로 정리해보려고 한다.

Polar Plot이란 '극좌표계'라고도 한다. Polar plot을 사용하려면 먼저 matplotlib 모듈이 필요하다.

일단 나는 파이참을 사용하여 개발 중이다. 큰 작업이 아닌 작은 작업들을 할 때 유용한데, 특히 필요한 모듈이 있으면 곧바로 검색해서 import 할 수 있다. 약간 모듈들을 잠시 빌려 쓰는 느낌이라고 할까

각설하고 numpy 모듈 또한 필요하다. numpy는 C언어로 구현된 파이썬 라이브러리이다. 고성능의 수치 계산을 위해 제작되었다. 주로 각종 수학적 함수를 사용하기 위해 쓰인다.

 

코드


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

np.seterr(divide='ignore', invalid='ignore')

앞서 설명했듯이 numpy와 maplotlib.pyplot을 import 하고, pandas는 csv파일을 읽어와서 그 값들을 적용해보려고 사용했다. 굳이 안 써도 됩니다.
그리고 np.seterr 이 코드는 어떤 에러 때문에 이걸 추가하면 발생하지 않는다고 해서 썼었는데.. 왜인지 지금은 지워도 발생하지 않는다.

 

# CSV file read
csv = pd.read_csv('data/2.csv', names=['x', 'y', 'dis', 'ang'])
dist = csv['dis']
angle = csv['ang']
dist_list = dist.values.tolist()
angle_list = angle.values.tolist()
dist_list.pop(0)
angle_list.pop(0)

pandas를 사용해서 csv파일을 읽어오는 코드이다.
data 폴더 안에 있는 2.csv 파일을 지정해주고, 각각의 열들을 선택한다. 여기선 dis랑 ang만 쓸 거라서 'x', 'y'는 빼도 될 것 같다.
dist, angle 변수에 각각 'dis', 'ang' 열 값들을 대입한다.
dist_list, angle_list 변수는 이 값들을 리스트 형식으로 변환하여 대입한다. 그냥 한번에 dist_list = csv['dis'].values.tolist() 이렇게 선언해도 된다.
그냥 대입하면 첫 번째 값이 문자가 들어가므로, 리스트의 첫 번째 값을 제거해준다.

이렇게 생김

 

# get a half circle polar plot
fig1, ax1 = plt.subplots(1, 1, subplot_kw={'projection': 'polar'})
fig1.set_facecolor('skyblue')
ax1.set_thetamax(180)

plt UI 1행 1열에 Polar Plot을 그린다.
보기 좋은 떡이 맛도 좋다고 스카이블루 색으로 그래프를 이쁘게 만들어 주자.
그리고 본인은 반원 형식으로 만들 예정이라 세타 최댓값을 180도로 설정하였다. 

 

degree = 15
for i in range(6):
    print(degree)
    # dist_list 대신 길이가 6인 리스트 선언 후 대입해도 됨
    plt.bar(np.pi / (180 / degree), int(dist_list[i]), width=0.5)
    degree += 30

이제 여기서부터 그래프를 딱 맞출 부분이다.
반원이므로 총 180도, 30도 간격으로 6개의 바 그래프를 만들기 위해서 우선 degree 변수를 만들고 15라는 값을 넣는다.
바 그래프의 중심을 잡아주기 위해서 인데, 반복문 내부에 plt.bar(np.pi / (180 / degree) 이 코드를 통해서 그린다.
bar를 Ctrl+클릭해보면 형식이 plt.bar(x, height, ...) 으로 되어있다.
x는 각도를 지정하고, height는 그래프의 높낮이를 설정한다.
degree를 30씩 총 6번 증가시켜 0~30, 30~60, .... 150~180 각도 안에 넣을 수 있다.

요로코롬.

 

ax1.set_xticks(np.arange(0, np.pi + 0.1, np.pi / 6))
ax1.set_xlabel("Test", fontsize=20)

plt.show()

set_xticks는 x축, 즉 각도의 간격을 설정한다.
0도 부터 pi + 0.1까지, pi / 6 간격으로 설정한다는 뜻이다.
set_xlabel은 x축, 각도의 레이블을 설정한다. 기본으로 아래에 위치한다.
이제 그래프 출력을 해주면 ...

 


끝.

반응형

'Development > Graph' 카테고리의 다른 글

PyQt5 PyQtGraph (+ clickEvent, Animation)  (0) 2021.10.18