국문과 유목민

Matplotlib [polar, pie] 사용법 본문

IT 견문록/함수 및 코드 (디지털치매 대비)

Matplotlib [polar, pie] 사용법

논곰 2022. 2. 10. 23:28
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

Matplotlib (polar, pie)

Polar Coordinate

 극좌표계를 사용하는 시각, 거리(R), 각(Theta)를 사용한 plot이다. 회전이나 주기성 등을 표현하기에 적합, 극좌표계를 사용해 표현되는 그래프는 scatter이기 때문에 line, bar 등을 사용할 수 있다. 

 

- Polar Coordinate 사용법

  • projection='ploar', polar=True: 서브플롯을 만들 때 활용해 사용할 수 있다.   
  • set_rmax() / set_rmin(): 반지름 조정
  • set_rticks(): 반지름 표기의 grid 조정
  • set_rlabel_position(): 반지름 label이 적히는 위치의 각도 조정
  • set_thetamax()/set_thetamin(): 각도의 min과 max 값 (360도 기준)  
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, polar=True)

ax.set_rmax(2)
ax.set_rmin(0) #  범위만 바뀐다.
ax.set_rticks([1, 1.5, 2]) 

# ax.set_rlabel_position(50) # label을 원하는 방식으로 적어줄 수 있다.  
ax.set_thetamin(0)
ax.set_thetamax(270)
plt.show()

set_rmin, set_rmax, set_rticks, set_thetamin, set_thetamax 가 적용된 Polar Coordinate

- Polar의 기본 차트

 polar의 기본차트로는 Scatter, Bar, Plot이 있다. 여기서 Plot을 그렸을 때는 'ax.fill()'을 통해서 면적을 칠할 수 있다. 

np.random.seed(19680801)
# scatter
N = 100
r = 2 * np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)
area = 200 * r**2
colors = theta
fig = plt.figure(figsize=(14, 14))
ax = fig.add_subplot(131, projection='polar')
c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75)# 색은 c, s는 원의 크기, cmap= pallete
ax.set_title('scatter')

# bar
N = 6
r = np.random.rand(N)
theta = np.linspace(0, 2*np.pi, N, endpoint=False)
ax2 = fig.add_subplot(132, projection='polar')
ax2.bar(theta, r, width=0.5, alpha=0.5)
ax2.set_title('bar')

# plot
N = 1000
r = np.linspace(0, 1, N)
theta = np.linspace(0, 2*np.pi, N)
ax3 = fig.add_subplot(133, projection='polar')
ax3.fill(theta, r) # ax3.plot(theta, r)
ax3.set_title('plot(fill)')
plt.show()

- Radar Plot

 극 좌표계에서 가장 대표적으로 사용하는 차트이다. 별 모양으로 생겨서 Star Plot이라고 불리기도 한다. 중심점을 기준으로 N개의 변수 값을 표현할 수 있다. 데이터의 Quality를 표현하기에 좋다. (캐릭터의 강함, 운동선수 분석, 성능 비교)

 자주 사용하는 만큼 주의해야할 점도 있다. 

  1. 각 feature는 독립적이며, 척도가 같아야 한다. 순서형 변수와 수치형 변수가 함께 있다면 고려가 필요하다. 소비자 만족도는 범주형이지만, 최대 속도, 연비 등은 연속형 변수이기 때문에 RadarPlot을 사용하는게 맞는 지 생각해봐야 한다.
  2. feature의 순서에 따라 면적이 달라지기 때문에 면적이 가지는 의미에 유의해야 한다.
  3. Feature가 많아질수록 가독성이 떨어진다.

위 polar coordinate의 fill을 적합하게 사용하면 Radar Chart를 사용할 수 있다. 끝점을 포함하기 위해서 마지막 데이터를 포함시켜줘야 한다. 그래야 끝 값과 첫 값 선을 연결할 수 있다. 

  • set_thetagrids : 각도에 따른 그리드 및 ticklabels 변경
  • set_theta_offset : 시작 각도 변경
fig = plt.figure()
ax = fig.add_subplot(111, projection='polar')

# 끝값과 첫값을 연결하기
values.append(values[0])
theta = theta.tolist() + [theta[0]]

ax.plot(theta, values)
ax.fill(theta, values, alpha=0.5)

plt.show()

print(values)
print(theta)

한 번에 여러 개의 데이터 비교하기

fig = plt.figure(figsize=(14, 4))

for idx in range(3):
    ax = fig.add_subplot(1,3,idx+1, projection='polar')

    values = pokemon.iloc[idx][stats].to_list()
    values.append(values[0])


    ax.plot(theta, values, color='forestgreen')
    ax.fill(theta, values, color='forestgreen', alpha=0.3)
    
    ax.set_rmax(100)
    ax.set_thetagrids([n*60 for n in range(6)], stats)
    ax.set_theta_offset(np.pi/2)
    
plt.show()

Pie Chart

 많이 사용되는 시각화 방법이다. 원을 부채꼴로 분할해 표현하는 통계차트이다. 전체를 백분위로 나타낼 때 유용하지만, 가장 많이 사용하는 차트임에도 연구에서는 지양하는 차트이다. 왜냐하면 feature의 개수가 많아지거나 비율의 차이가 적으면 구분이 쉽지 않고, 보통 사람의 눈은 각도를 통한 비교보다는 크기에 대한 이해가 더 효과적이라고 한다. 따라서 사용을 하고 싶다면 다른 차트와 같이 사용하는 것이 좋다.
 파이차트와 유사한 차트로 중간이 비어있는 Donut Chart, 햇살을 닮은 Sunburst Chart 등이 있다. 두 차트다 별로 추천은 안 한다고 한다. 

np.random.seed(97)

data = np.array([16, 18, 20, 22, 24])
labels = list('ABCDE')
color = plt.cm.get_cmap('tab10').colors[:5]
fig, axes = plt.subplots(2, 3, figsize=(15, 10))

for i in range(3):
    axes[0][i].pie(data, labels=labels)
    axes[1][i].bar(labels, data, color=color)
    np.random.shuffle(data)

plt.show()

파이차트로는 얼마만큼의 차이가 있는 지 확인하기 쉽지 않다.

- PieChart Custom

  • startangle: 시작 위치를 지정
  • explode: 파이차트의 특정 부분을 띄울 수 있다.
  • shadow: 그림자(음영)효과
  • autopct: 전체 비율을 %로 나타내준다. 
  • labeldistance: label의 길이를 조정한다.
  • rotatelabels: 라벨이 원을 따라서 기울여진다. (비추천)
  • counterclock: 시계방향으로 그릴 수 있다. 
  • textprops: 글자의 색상을 변경할 수 있다.
fig, ax = plt.subplots(1, 1, figsize=(7, 7))
explode = [0, 0, 0.2, 0]

ax.pie(data, labels=labels, explode=explode, startangle=90,
      shadow=True, autopct='%1.1f%%', labeldistance=1.24, textprops={'color':"purple"}
#        , rotatelabels=90
      )
plt.show()

▶ Review (생각)

 

Comments