[혼공데이터분석] chapter 6.

회색몽구스·2023년 8월 20일
0

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

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

pyplot 방식과 객체지향 API 방식

matplotlib.pyplot에 있는 함수를 사용하는 pyplot 방식, 명시적으로 피겨 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용하는 객체지향 API 방식이 있습니다.

pyplot 방식으로 그래프 그리기

matplotlib.pyplot에 있는 함수를 사용하면 함수들이 하나의 피겨 객체에 대한 상태를 공유

객체지향 API 방식으로 그래프 그리기

fig, ax = plt.subplots()
ax.plot([1, 4, 9, 16])
ax.set_title('simple line graph')
fig.show()

fig라는 틀에 ax라는 종이를 놓고 그 위에 그래프를 그린다고 생각합시다.
복잡한 그래프를 그리는 경우 객체지향 방식을 사용하는 것이 좋습니다.

그래프에 한글 출력하기

코랩의 경우 아래 코드를 실행하여 나눔 폰트를 설치할 수 있습니다.

# 노트북이 코랩에서 실행 중인지 체크합니다.
import sys
if 'google.colab' in sys.modules:
    !echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
    # 나눔 폰트를 설치합니다.
    !sudo apt-get -qq -y install fonts-nanum
    import matplotlib.font_manager as fm
    font_files = fm.findSystemFonts(fontpaths=['/usr/share/fonts/truetype/nanum'])
    for fpath in font_files:
        fm.fontManager.addfont(fpath)

나눔 폰트를 설치한 후 다시 맷플롯립을 다시 임포트하고 DPI 기본값을 변경

import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 100

폰트 지정하기 (1): font.family 속성

rcParams 객체의 font.family 속성에 저장되어 있습니다.

plt.rcParams['font.family'] = 'NanumGothic'

폰트 지정하기 (2): rc() 함수

rc() 함수의 첫번째 매개변수에는 설정할 그룹을 지정 ('font')
family는 그룹의 하위 속성을 지정

plt.rc('font', family='NanumBarunGothic', size=11)

출판사별 발행 도서 개수 산점도 그리기

value_counts() 메서드를 사용해 고유한 출판사 목록을 만듭니다.
isin() 메서드를 사용해 상위 30개 출판사에 해당하는지 불리언 인덱스 만들기
1000개만 무작위로 선택 - sample() 메서드

산점도 그리기

값에 따라 마커 크기를 다르게 나타내기

scatter() 함수는 마커의 크기를 지정할 수 있는 s 매개변수를 제공
rcParams['lines.markersize']로 지정하며 기본값은 6

마커 꾸미기

1) 투명도 조절하기 - alpha 매개변수
2) 마커 테두리 색 바꾸기 - edgecolor 매개변수
3) 마커 테두리 선 두께 바꾸기 - linewidths 매개변수
4) 산점도 색 바꾸기 - c 매개변수

값에 따라 색상 표현하기: 컬러맵

기본값은 viridis 컬러맵
자주 사용하는 컬러맵 중의 하나는 jet
컬러맵은 cmap 매개변수로 지정할 수 있고, 컬러 막대는 scatter() 함수가 반환하는 객체를 colorbar() 메서드에 전달하면 됩니다.

06-2 맷플롯립의 고급 기능 배우기

실습 준비하기

하나의 피겨에 여러 개의 선 그래프 그리기

groupby() 메서드를 사용해 '출판사'와 '발행년도' 열을 기준으로 행을 모은 후 sum() 메서드로 '대출건수 열의 합을 구해 줍시다.
인덱스를 초기화하기 위해 reset_index() 메서드를 호출

선그래프 2개 그리기

plot() 함수를 2번 호출
그래프에 범례를 추가하려면 각 선 그래프에 label 매개변수를 이용
마지막에 legend() 메서드를 호출

선그래프 5개 그리기

출력할 x축의 좌표 범위를 지정하려면 set_xlim() 메서드를 사용,
비슷하게 set_ylim() 메서드는 y축의 좌표 범위를 지정할 수 있음

스택 영역 그래프

pivot_table() 메서드로 각 '발행년도' 열의 값을 열로 바꾸기

index, columns 매개변수에 원본 데이터프레임의 열을 지정하면 각 열의 고유한 값이 피벗 테이블로 변환된 데이터프레임의 인덱스와 열이 됩니다.

ns_book10 = ns_book9.pivot_table(index='출판사', columns='발행년도')
ns_book10.head()
'발행년도' 열을 리스트 형태로 바꾸기

get_level_values() 메서드는 다단으로 구성된 열 이름에서 선택한 항목만 가져올 수 있습니다.

top10_pubs = top30_pubs.index[:10]
year_cols = ns_book10.columns.get_level_values(1)
stackplot() 메서드로 스택 영역 그래프 그리기
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() 메서드를 여러 번 호출
나란히 옆으로 그리려면 막대의 기본 너비를 0.4로 반으로 줄인 다음 x축에서 막대 하나 너비인 0.4의 절반인 0.2씩 떨어지도록 그려봅시다.

스택 막대 그래프

맷플롯립에는 막대 그래프를 쌓을 수 없어서 bar() 메서드의 bottom 매개변수를 사용하여 막대를 쌓아 올리거나,
y축 방향으로 데이터값을 누적하여 그려야 합니다.

데이터값 누적하여 그리기

판다스의 cumsum() 메서드를 사용하여 값을 누적하여 그려봅시다.
주의할 점은 가장 큰 막대를 먼저 그려야 함

원 그래프 그리기

3시 방향부터 반시계 방향으로 그려지지만, 크기 순으로 정렬되어 있지 않은 데이터를 사용했다면 가시성이 많이 떨어집니다.
startangle 매개변수를 지정하면 12시 방향부터 그릴 수 있음
autopct 매개변수에 파이썬의 %연산자에 적용할 포맷팅 문자열을 전달할 수 있음

  • 이를 이용해 각 부채꼴이 원에서 차지하는 비율을 표시할 수 있음

explode 매개변수에 떨어뜨리길 원하는 조각의 간격을 반지름의 비율로 지정할 수 있음

  • 해당 부채꼴 조각을 원 그래프에서 조금 떨어뜨려 시각적으로 부각시킬 수 있음

여러 종류의 그래프가 있는 서브플롯 그리기

앞에서 그렸던 그래프를 한 프레임에 모두 그려 봅시다.
plt.subplots() 함수의 매개변수에 행, 열 개수를 지정할 수 있으며
subplots() 함수에서 반환 받은 Axes 객체를 사용해 각 격자의 위치를 지정해 그 안에 그림을 넣을 수 있음

profile
끄아아아아 할 수 있다

0개의 댓글