Chapter 06. 복잡한 데이터 표현하기

강민석·2023년 2월 18일
0

데이터 분석

목록 보기
6/7

실습 코드 :
6-1 : https://colab.research.google.com/drive/1Ic_iY1llLhdKPoS8IOAEMHWKoIp5wGVS?usp=sharing
6-2 : https://colab.research.google.com/drive/1tb1SFZwz12tRde_l90nZbaiulMVX_EZg?usp=sharing

객체지향 API로 그래프 꾸미기

복잡한 그래프나 한 피겨에 여러개의 서브플롯을 사용하는 경우 객체지향 방식으로 그래프를 그리는 것이 유리하다.

그래프에 한글 출력하기

rc() 함수

rcParams로 지정하던 옵션들을 한번에 여러개 수정할 수 있다.

plt.rc(<그룹>, <그룹 하위 속성>)
plt.rc('font', family='NanumbarunGothic)

폰트 추가 에러 대응

새로운 폰트 추가하여도 jupiter notebook의 캐시에는 바로 적용되지 않기 때문에 캐시 삭제후 커널을 재시작해줘야 폰트 목록이 재설정된다.

  1. 캐시 파일 경로 확인
import matplotlib
matplotlib.get_cachedir()

-> 'C:\Users\Administrator\.matplotlib'
2. 해당 파일 삭제 후 커널 재시작.

마커 꾸미기

출판사의 연도별 도서 발행 개수 산점도를 그려보며 실습해보았다.

마커 크기 변경

rcParams['lines.mrkersize']로 지정하며 기본값은 6. scatter()는 s라는 매개변수로 조정할 수 있다.

ax.scatter(ns_book8.발행년도, ns_book8.출판사, s=ns_book8.대출건수)

추가 매개변수

  • alpha : 투명도 조절
  • edgecolor : 테두리 색상. 기본값=face(마커 색상)
  • linewidths : 테두리 두께. 기본값=1.5
  • c : 산점도 색상. 수치 입력 시 큰값은 노랑, 낮은값은 녹색으로 표현
ax.scatter(ns_book8.발행년도, ns_book8.출판사, linewidths=0.5, edgecolors='k', alpha=0.3, s=ns_book8.대출건수*2, c=ns_book8.대출건수)

컬러맵

값에 따라 다른 색상을 표현가능. 대표적인 jet 컬러맵은 파랑->노랑->빨강 순으로 값의 크기를 표현.

colorbar() : 컬러막대를 나타내주는 함수

sc = ax.scatter(ns_book8.발행년도, ns_book8.출판사, linewidths=0.5, edgecolors='k', alpha=0.3, s=ns_book8.대출건수*2, c=ns_book8.대출건수, cmap='jet')
fig.colorbar(sc)
fig.show()

matplotlib의 고급 기능들

여러 그래프를 하나의 figure에 그리기

선그래프 여러개 그리기

간단히 plot()을 두 번 호출하면 가능하다.

line1 = ns_book9[ns_book9['출판사'] == '황금가지']
line2 = ns_book9[ns_book9['출판사'] == '비룡소']

fig, ax = plt.subplots(figsize=(8,6))
ax.plot(line1['발행년도'], line1['대출건수'])
ax.plot(line2['발행년도'], line2['대출건수'])

범례 추가하기

plot()에 label 매개변수를 설정 후 lengend() 메서드를 호출한다.

fig, ax = plt.subplots(figsize=(8,6))
ax.plot(line1['발행년도'], line1['대출건수'], label='황금가지')
ax.plot(line2['발행년도'], line2['대출건수'], label='비룡소')
ax.set_title('연도별 대출건수')
ax.legend()
fig.show()

for loop를 통한 5개 그리기

fig, ax = plt.subplots(figsize=(8,6))
for pub in top30_pubs.index[:5]:
    line = ns_book9[ns_book9['출판사'] == pub]
    ax.plot(line['발행년도'], line['대출건수'], label=pub)
ax.set_title('연도별 대출건수')
ax.legend()
ax.set_xlim(1985, 2025)
fig.show()

스택 영역 그래프

선 그래프를 차례대로 쌓는 것으로, 그래프 사이의 간격이 y축이 값이다. y축 값을 2차원 배열로 전달해야 한다.

  1. pivot_table()로 2차원 배열 생성
ns_book10 = ns_book9.pivot_table(index='출판사', columns='발행년도')
  1. get_level_values(<인덱스>)로 2차원 배열의 열을 리스트 형태로 변경
year_cols = ns_book10.columns.get_level_values(1)
  1. 스택 그래프로 표현
fig ax = plt.subplots(figsize=(8, 6))
ax.stackplot(year_cols, ns_book10.loc[top10_pubs].fillna(0), labels=top10_pubs)
ax.set_title('연도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985, 2025)
fig.show()

여러 개의 막대 그래프

선그래프와 같이 bar()를 여러번 호출한다.

fig, ax = plt.subplots(figsize=(8, 6))
ax.bar(line1['발행년도'], line1['대출건수'], label='황금가지')
ax.bar(line2['발행년도'], line2['대출건수'], label='비룡소')
ax.set_title('연도별 대출건수')
ax.legend()
fig.show()

막대 크기조절 및 이동으로 겹치지 않는 막대그래프 그리기

fig, ax = plt.subplots(figsize=(8, 6))
ax.bar(line1['발행년도']-0.2, line1['대출건수'], width=0.4, label='황금가지')
ax.bar(line2['발행년도']+0.2, line2['대출건수'], width=0.4, label='비룡소')
ax.set_title('연도별 대출건수')
ax.legend()
fig.show()

스택 막대 그래프

matplotlib는 스택막대를 지원하지 않으므로 수동으로 높이를 합친 후 겹쳐 그림

height1 = [5, 4, 7, 9, 8]
height2 = [3, 2, 4, 1, 2]
height3 = [a + b for a, b in zip(height1, height2)]

plt.bar(range(5), height3)
plt.bar(range(5), height1)

pandas의 누적 합계 함수 cumsum()을 통해 쉽게 그리기

ns_book10.loc[top10_pubs[:5], ('대출건수',2013):('대출건수',2020)]

ns_book10.loc[top10_pubs[:5], ('대출건수',2013):('대출건수',2020)].cumsum()

fig, ax = plt.subplots(figsize=(8,6))
for i in reversed(range(len(ns_book12))):
    bar = ns_book12.iloc[i]
    label = ns_book12.index[i]
    ax.bar(year_cols, bar, label=label)
ax.set_title('연도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985, 2025)

원 그래프 그리기

pie()를 통해 표현가능. 3시부터 반시계방향의 순서대로 표현한다.

data = top30_pubs[:10]
labels = top30_pubs.index[:10]

fig, ax = plt.subplots(figsize=(8,6))
ax.pie(data, labels=labels)
ax.set_title('출판사 도서 비율')

startangle 매개변수를 통해 시작 각도 조절가능

plt.pie([10,9], labels=['A제품', 'B제품'], startangle=90)

autopct 매개변수로 비율 표시하기

fig, ax = plt.subplots(figsize=(8,6))
ax.pie(data, labels=labels, startangle=90, autopct='%.1f%%')
ax.set_title('출판사 도서 비율')

explode 매개변수로 강조하기. 떨어진 정도의 리스트를 전달해야 한다.

fig, ax = plt.subplots(figsize=(8,6))
ax.pie(data, labels=labels, startangle=90, autopct='%.1f%%', explode=[0.1]+[0]*9)
ax.set_title('출판사 도서 비율')

pandas를 활용해 스택 그래프 쉽게 그리기

plot.area()로 스택 영역 그래프 그리기

pivot_table() 명령어 사용 시 values 매개변수에 값을 지정하여 get_level_values()를 생략 가능

ns_book11 = ns_book9.pivot_table(index='발행년도', columns='출판사', values='대출건수')

fig, ax = plt.subplots(figsize=(8,6))
ns_book11[top10_pubs].plot.area(ax=ax, title='연도별 대출건수', xlim=(1985,2025))
ax.legend(loc='upper left')

스택 막대 그래프 그리기

plot.bar() 메서드에서 stacked 매개변수를 true로 설정

fig, ax = plt.subplots(figsize=(8, 6))
ns_book11.loc[1985:2025, top10_pubs].plot.bar(ax=ax, title='년도별 대출건수', stacked=True, width=0.8)
ax.legend(loc='upper left')
profile
새내기 개발자입니다.

0개의 댓글