6. 복잡한 데이터 표현하기 1) 객체지향 API로 그래프 꾸미기 (1) pyplot 및 객체지향 API 방식으로 그래프 그리기 (2) 출판사별 발행 도서 개수 산점도 그리기 2) 맷플롯립의 고급 기능 배우기 (1) 여러 개의 선 그래프 그리기 (2) 스택 영역 그래프 그리기 (3) 여러 개의 막대 그래프 그리기 (4) 원 그래프 그리기 (5) 여러 종류 그래프가 있는 서브플롯 그리기
1) 객체지향 API로 그래프 꾸미기
(1) 그래프 그리기
① pyplot 방식
- matplotlib.pyplot에 있는 함수를 사용
- y축은 plot() 함수에 전달한 값, x축은 인덱스 값으로 함
import matplotlib.pyplot as plt
plt.plot([ 1 , 4 , 9 , 16 ])
plt.title( 'simple line graph' )
plt.show()
pyplot 방식 그래프
② 객체지향 API 방식
- 동일한 그래프를 피겨(fig) 객체와 Axes 객체를 사용하여 그리기
- 피겨 객체 설정을 바꾸거나, 서브플롯을 추가하는 경우에 사용함
fig, ax = plt.subplots()
ax.plot([ 1 , 4 , 9 , 16 ])
ax.set_title( 'simple line graph' )
fig.show()
(2) 출판사별 발행 도서 개수 산점도 그리기
① 고유한 출판사 목록 만들기
- [value_counts() 메서드] 로 상위 30개 출판사 목록을 만들며, 해당 메서드는 내림차순 정렬함
import pandas as pd
ns_book7 = pd.read_csv( 'ns_book7.csv' , low_memory= False )
top30_pubs = ns_book7[ '출판사' ].value_counts()[: 30 ]
top30_pubs
문학동네 4410 민음사 3349 ... 북이십일 1026
- [isin() 메서드] 로 상위 30개 출판사에 해당하면 True, 아니면 False로 반환함
- [sample() 메서드] 로 무작위 1000개 행 선택하고, [random_state 매개변수] 로 동일한 결과 출력
top30_pubs_idx = ns_book7[ '출판사' ].isin(top30_pubs.index)
top30_pubs_idx
0 True 1 False ... 376769 False
ns_book8 = ns_book7[top30_pubs_idx].sample( 1000 , random_state= 42 )
② 산점도 그리기
- [subplots() 함수] 로 피겨의 크기를 지정함
- [scattter() 함수] 로 x축은 '발행년도', y축은 '출판사'를 지정하여 산점도 그리기
fig, ax = plt.subplots(figsize=( 10 , 8 ))
ax.scatter(ns_book8[ '발행년도' ], ns_book8[ '출판사' ])
ax.set_title( '출판사별 발행도서' )
fig.show()
산점도 그래프
③ 마커 꾸미기
- [s 매개변수] 로 마커 크기를 다르게 나타내기 ('대출건수' X 2 값으로 마커 크기 지정)
- [linewidths 매개변수] 로 마커 테두리 선의 두께 바꾸기 (기본값 1.5)
- [edgecolors 매개변수] 로 마커 테두리 색 바꾸기 (기본값 face, 검정색 k)
- [alpha 매개변수] 로 마커 투명도 조절하기 (진할수록 해당 값이 많음을 의미)
- [c 매개변수] 로 마커 색 바꾸기 (작은 값은 짙은 녹색 → 큰 값은 밝은 노랑)
- [colorbar() 메서드] 로 색깔이 어떤 값에 대응하는지 참조 정보를 제공하는 컬러 막대 표시하기
fig, ax = plt.subplots(figsize=( 10 , 8 ))
sc = ax.scatter(ns_book8[ '발행년도' ], ns_book8[ '출판사' ], s=ns_book8[ '대출건수' ]* 2 ,
linewidths= 0.5 , edgecolors= 'k' , alpha= 0.3 , c=ns_book8[ '대출건수' ])
ax.set_title( '출판사별 발행도서' )
fig.colorbar(sc)
fig.show()
마커 꾸미기 (jet 컬러맵)
④ 컬러맵 (값에 따라 색상 표현)
- [cmap 매개변수] 로 컬러맵을 지정함 (파랑→ 노랑→빨강 순인 jet 컬러맵을 자주 사용함)
2) 맷플롯립의 고급 기능 배우기
(1) 여러 개의 선 그래프 그리기
① 2개의 선 그래프 그리기
- 상위 30위 출판사에 해당하는 행만 선택해서 '출판사', '발행년도', '대출건수' 열을 추출함
- [groupby() 메서드] 로 '출판사'&'발행년도' 기준으로 행을 묶은 후, [sum() 메서드] 로 '대출건수' 합을 계산함
top30_pubs = ns_book7[ '출판사' ].value_counts()[: 30 ]
top30_pubs_idx = ns_book7[ '출판사' ].isin(top30_pubs.index)
ns_book9 = ns_book7[top30_pubs_idx][[ '출판사' , '발행년도' , '대출건수' ]]
ns_book9 = ns_book9.groupby(by=[ '출판사' , '발행년도' ]). sum ()
- 2개 출판사에 대한 선 그래프를 그림
- [label 매개변수] 로 레이블을 추가하고, [legend() 메서드] 로 범례를 추가함
line1 = ns_book9[ns_book9[ '출판사' ] == '황금가지' ]
line2 = ns_book9[ns_book9[ '출판사' ] == '비룡소' ]
fig, ax = plt.subplots(figsize=( 8 , 6 ))
ax.plot(line1[ '발행년도' ], line1[ '대출건수' ], label= '황금가지' )
ax.plot(line2[ '발행년도' ], line2[ '대출건수' ], label= '비룡소' )
ax.set_title( '년도별 대출건수' )
ax.legend()
fig.show()
2개의 선 그래프
② 5개의 선 그래프 그리기
- 상위 5개 출판사에 대해 선 그래프 그리기
- [set_xlim() 메서드] 로 x축의 좌표 범위를 설정함 (y축은 [set_ylim() 메서드] )
fig, ax = plt.subplots(figsize=( 8 , 6 ))
for pub in top30_pubs.index[: 5 ]:
line = ns_book9[ns_book9[ '출판사' ] == pub] # 상위 5개 출판사 선정
ax.plot(line[ '발행년도' ], line[ '대출건수' ], label=pub) # 5개 선 그래프 그리기
ax.set_title( '년도별 대출건수' )
ax.legend()
ax.set_xlim( 1985 , 2025 )
fig.show()
(2) 스택 영역 그래프 그리기
- [pivot_table() 메서드] 로 열 이름을 '발행년도' 값으로 바꾸기 (열 값이 하나의 열이 되게)
- [get_level_values() 메서드] 로 다단으로 구성된 열에서 선택한 항목만 가져올 수 있음
- [stackplot() 메서드] 로 스택 영역 그래프 그리기
- [fillna() 메서드] 로 누락된 값을 0으로 채움
- [loc 매개변수] 로 범례 위치 지정 (기본값은 'best'로 최상단 위치)
ns_book10 = ns_book9.pivot_table(index= '출판사' , columns= '발행년도' )
top5_pubs = top30_pubs.index[: 5 ]
year_cols = ns_book10.columns.get_level_values( 1 )
fig, ax = plt.subplots(figsize=( 8 , 6 ))
ax.stackplot(year_cols, ns_book10.loc[top5_pubs].fillna( 0 ), labels=top5_pubs)
ax.set_title( '년도별 대출건수' )
ax.legend(loc= 'upper left' )
ax.set_xlim( 1985 , 2025 )
fig.show()
스택 영역 그래프
(3) 여러 개의 막대 그래프 그리기
① 묶은 세로 막대 그래프
- [bar() 메서드] 로 막대 그래프 그리며, x값 위치를 이동시켜 옆으로 나란한 막대 그래프를 그림
- [width 매개변수] 로 막대 두께 지정
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()
묶은 세로 막대 그래프
② 누적 세로 막대 그래프
- [cumsum() 메서드] 로 누적 값을 계산함
- 큰 막대(누적 값)를 먼저 그린 후, 작은 막대 순으로 그려서 막대를 쌓을 수 있음
- [range() 함수] 로 행 개수만큼 인덱스 번호를 만들고, for 문에 [reversed() 함수] 로 인덱스의 역순으로 반복하여 그림
ns_book12 = ns_book10.loc[top5_pubs].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)
누적 세로 막대 그래프
(4) 원 그래프 그리기
- 상위 5개 출판사의 도서 개수 및 인덱스를 저장함
- [pie() 메서드] 로 원 그래프 그리기
- [startangle 매개변수] 를 90으로 지정하면 12시 방향부터 반시계 방향 순으로 그림 (기본값 3시 방향부터 반시계 방향 순)
- [autopct 매개변수] 로 포맷팅 문자열 지정 ('%d'는 정수)
- [explode 매개변수] 로 원하는 조각을 떨어뜨려 중요한 항목 강조
data = top30_pubs[: 5 ]
labels = top30_pubs.index[: 5 ]
fig, ax = plt.subplots(figsize=( 8 , 6 ))
ax.pie(data, labels=labels, startangle= 90 , autopct= '%.1f%%' , explode=[ 0.1 ]+[ 0 ]* 4 )
ax.set_title( '출판사 도서비율' )
fig.show()
원 그래프
(5) 여러 종류 그래프가 있는 서브플롯 그리기
fig, axes = plt.subplots( 2 , 2 , figsize=( 20 , 16 ))
fig.savefig( 'all_in_one.png' )
fig.show()
여러 종류 그래프가 있는 서브플롯
6주차 미션
6주차. 기본 미션
p344의 손코딩(맷플롯립의 컬러맵으로 산점도 그리기)을 코랩에서 그래프 출력하고 화면 캡처 하기
기본미션. 맷플롯립의 컬러맵으로 산점도 그리기
6주차. 선택 미션
p356 ~ 359의 스택 영역 그래프를 그리는 과정을 정리 하기
선택미션. 스택 영역 그래프 그리기