코딩하는 해맑은 거북이

[데이터시각화] Polar Coordinate - Polar, Radar Plot 본문

Data Analysis & Viz

[데이터시각화] Polar Coordinate - Polar, Radar Plot

#CJE 2023. 3. 27.
본 게시물의 내용은 '부스트캠프 AI Tech - Data Visualization(안수빈)' 강의를 듣고 작성하였다.
해당 글은 아래의 2가지를 다룬다.
🍀 Polar Plot
🍀 Radar Plot
  🚩 Pokemon with Stat

 

 

🍀 Polar Plot

- 극 좌표계(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()

 

 

🍀 Radar Plot

- 극좌표계를 사용하는 대표적인 차트

- 별 모양으로 생겨 Star Plot으로 불리기도 함

- 중심점을 기준으로 N개의 변수 값을 표현할 수 있음

- 데이터의 Quality를 표현하기에 좋음 (비교에도 적합)

- Radar Chart 주의점

  1) 각 feature는 독립적이며, 척도가 같아야 함 (순서형 변수와 수치형 변수가 함께 있다면 고려 필요)
  2) 다각형의 면적이 중요해보지만 feature의 순서에 따라 많이 달라짐

  3) Feature가 많아질수록 가독성이 떨어짐

 

 

🚩 Pokemon with Stat

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()

 

 

Comments