코딩하는 해맑은 거북이
[데이터시각화] Polar Coordinate - Polar, Radar Plot 본문
본 게시물의 내용은 '부스트캠프 AI Tech - Data Visualization(안수빈)' 강의를 듣고 작성하였다.
해당 글은 아래의 2가지를 다룬다.
🍀 Polar Plot
🍀 Radar Plot
🚩 Pokemon with Stat
- 극 좌표계(Polar Coordinate)를 사용하는 시각화 (거리(R), 각(Theta) 사용해서 plot)
- 회전, 주기성 등을 표현하기에 적합
- projection = polar 을 추가하여 사용
- 직교 좌표계 X, Y에서 변환 가능 → Data Converting
- Polar Coordinate 생성방법 2가지
- projection='polar'
- polar=True
fig = plt.figure()
ax = fig.add_subplot(111, projection='polar')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
plt.show()
- Polar Coordinate 조정
- set_rmax : 반지름 조정
- set_rmin : 원의 중심인 시작점 설정
- set_rticks : 반지름 표기 grid 조정
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.set_rmax(2) # 반지름 설정
ax.set_rmin(1) # 원의 중심인 시작점을 설정
ax.set_rticks([1, 1.5, 2]) # 반지름 표기 grid 조정
plt.show()
- set_rlabel_position: 반지름 label이 적히는 위치의 각도 조정
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.set_rlabel_position(-90)
plt.show()
- 부채꼴 모양 생성하는 방법
- set_thetamin() : 각도의 min값
- set_thetamax() : 각도의 max값
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.set_thetamin(45)
ax.set_thetamax(135)
plt.show()
- Polar의 기본 차트
- scatter() : 기존 산점도와 같음 (theta, r 순서)
- bar()
- plot()
- fill()
- 극좌표계를 사용하는 대표적인 차트
- 별 모양으로 생겨 Star Plot으로 불리기도 함
- 중심점을 기준으로 N개의 변수 값을 표현할 수 있음
- 데이터의 Quality를 표현하기에 좋음 (비교에도 적합)
- Radar Chart 주의점
1) 각 feature는 독립적이며, 척도가 같아야 함 (순서형 변수와 수치형 변수가 함께 있다면 고려 필요)
2) 다각형의 면적이 중요해보지만 feature의 순서에 따라 많이 달라짐
3) Feature가 많아질수록 가독성이 떨어짐
pokemon = pd.read_csv('./pokemon.csv')
pokemon.head()
pokemon.describe()
→ HP, Attack, Defense, Sp.Atk, Sp.Def, Speed 총 6가지 요소가 포켓몬의 역량을 나타내는 수치
- 해당 포켓몬 데이터로 6가지의 스탯을 나타내는 Radar plot을 그려보자.
fig = plt.figure()
ax = fig.add_subplot(111, projection='polar')
theta = np.linspace(0, 2*np.pi, 6, endpoint=False) # 180도=2π를 6등분한다!
ax.plot(theta, values) # 마지막 값과 첫번째 값이 이어지지 않음
ax.fill(theta, values, alpha=0.5)
plt.show()
→ 끝과 처음이 이어지지 않기때문에 values와 theta의 리스트에 첫번째 원소를 추가해준다.
fig = plt.figure()
ax = fig.add_subplot(111, projection='polar')
theta = np.linspace(0, 2*np.pi, 6, endpoint=False) # 180도=2π를 6등분한다!
# 마지막 값과 첫번째 값을 이어주기 위해서 첫번째 값을 추가해줌
values.append(values[0])
theta = theta.tolist() + [theta[0]]
ax.plot(theta, values)
ax.fill(theta, values, alpha=0.5)
plt.show()
- set_rmax : 반지름 최대 길이 설정
- set_thetagrids : 각도에 따른 그리드 및 ticklabels 변경
- set_theta_offset : 시작 각도 변경
fig = plt.figure(figsize=(4, 4))
ax = fig.add_subplot(111, projection='polar')
theta = np.linspace(0, 2*np.pi, 6, endpoint=False) # 180도=2π를 6등분한다!
theta = theta.tolist() + [theta[0]]
values = pokemon.iloc[0][stats].to_list()
values.append(values[0])
ax.plot(theta, values)
ax.fill(theta, values, alpha=0.5)
ax.set_rmax(100)
ax.set_thetagrids([n*60 for n in range(6)], stats) # 원하는 각도 지점에 label을 달아줄수있음
ax.set_theta_offset(np.pi/2) # 0도인 HP를 90도의 위치로 변경
plt.show()
'Data Analysis & Viz' 카테고리의 다른 글
[데이터시각화] Missingno, Treemap, Waffle Chart, Venn (0) | 2023.03.27 |
---|---|
[데이터시각화] Pie Charts (0) | 2023.03.27 |
[데이터시각화] Seaborn (0) | 2023.03.27 |
[데이터시각화] Grid, 선/면 추가, 테두리 설정, Setting 변경 (0) | 2023.03.22 |
[데이터시각화] Facet (0) | 2023.03.22 |
Comments