-
혼자 공부하는 데이터 분석 CH 06 복잡한 데이터 표현하기Study/Data Analysis 2025. 9. 26. 10:46

목차
- 들어가며: Matplotlib 그래프, 더 자유롭게 다루기
- 그래프 꾸미기의 시작: 객체지향 API
- 2-1. Pyplot 방식 vs 객체지향 API 방식
- 2-2. 한글 폰트 설정하기
- 데이터 시각화 실전: 산점도 개선하기
- 3-1. 기본 산점도 그리기
- 3-2. 마커 크기와 색상으로 정보 추가하기
- 3-3. 컬러바(Colorbar) 활용하기
- Matplotlib 고급 기능 활용
- 4-1. 하나의 Figure에 여러 그래프 그리기 (선, 막대)
- 4-2. 누적 정보를 보여주는 스택 그래프 (영역, 막대)
- 4-3. 비율을 보여주는 원 그래프 (파이 차트)
- 4-4. 서브플롯으로 여러 그래프 한 번에 배치하기
- 더 간편한 시각화: Pandas 플롯 기능
- 마치며: 데이터의 스토리를 만드는 시각화 기술
들어가며: Matplotlib 그래프, 더 자유롭게 다루기
안녕하세요! 이전에는 Matplotlib의 기본적인 사용법을 알아보았다면,
이번 시간에는 그래프의 각 요소를 더욱 세밀하게 제어하고 꾸밀 수 있는 객체지향 API 방식과 다양한 고급 시각화 기법에 대해 알아보겠습니다.
단순한 선 그래프를 넘어, 데이터의 다차원적인 정보를 효과적으로 표현하는 산점도, 여러 데이터 시리즈를 비교하는 다중 그래프, 전체에서 각 부분의 비율을 보여주는 스택 그래프와 원 그래프까지 다양한 예제를 통해 배워보겠습니다. 이 글을 통해 Matplotlib를 더욱 자유자재로 다루며 데이터 속에 숨겨진 이야기를 효과적으로 전달하는 능력을 길러보세요.
2. 그래프 꾸미기의 시작: 객체지향 API


Matplotlib에는 그래프를 그리는 두 가지 주요 방식이 있습니다.
바로 Pyplot 함수를 직접 사용하는 방식과, Figure와 Axes 객체를 만들어 사용하는 객체지향 API 방식입니다.
2-1. Pyplot 방식 vs 객체지향 API 방식
- Pyplot 방식 (함수형): plt.plot(), plt.title()처럼 간단한 함수 호출로 빠르게 그래프를 그릴 수 있습니다. 내부적으로는 현재 활성화된 Figure와 Axes에 그래프를 그리는 방식입니다.
- 객체지향 API 방식: fig, ax = plt.subplots() 코드로 Figure(그래프 전체 틀)와 Axes(실제 그래프가 그려지는 영역) 객체를 명시적으로 생성합니다. 이를 통해 여러 개의 그래프를 그리거나 각 요소(제목, 축, 범례 등)를 더 세밀하게 제어할 수 있어 복잡한 시각화에 더 적합합니다.
import matplotlib.pyplot as plt # Pyplot 방식 - 전역 상태를 사용하는 함수형 접근 plt.plot([1, 4, 9, 16]) plt.title('pyplot style') plt.show() # 객체지향 방식 - Figure와 Axes 객체를 직접 제어 fig, ax = plt.subplots() # Figure와 Axes 객체 생성 ax.plot([1, 4, 9, 16]) # Axes 객체의 메서드 사용 ax.set_title('object-oriented style') # 제목 설정 fig.show()2-2. 한글 폰트 설정하기
Matplotlib는 기본적으로 한글 폰트를 지원하지 않아, 별도의 설정이 필요합니다.
코랩(Colab) 환경에서는 나눔 폰트를 설치하고 Matplotlib에 등록하여 사용할 수 있습니다.
# 코랩 환경에서 나눔 폰트 설치 및 Matplotlib 설정 import sys if 'google.colab' in sys.modules: !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) # plt.rc() 함수로 전역 폰트 설정 (가장 간편) plt.rc('font', family='NanumBarunGothic', size=11) plt.rcParams['figure.dpi'] = 100 # 그래프 해상도 설정 # 한글 제목으로 테스트 plt.plot([1, 4, 9, 16]) plt.title('간단한 선 그래프') plt.show() # 한글이 정상적으로 출력됩니다.
3. 데이터 시각화 실전: 산점도 개선하기
이제 객체지향 API를 활용하여 출판사별 도서 데이터를 이용한 산점도를 단계별로 개선해 보겠습니다. 산점도는 두 변수 간의 관계를 파악하는 데 유용하며, 마커의 크기, 색상 등을 추가하여 3차원, 4차원의 정보까지 표현할 수 있습니다.
3-1. 기본 산점도 그리기

먼저 ax.scatter()를 사용해 발행년도와 출판사를 축으로 하는 기본 산점도를 그립니다.
# (데이터 준비 과정은 생략) fig, ax = plt.subplots(figsize=(10, 8)) ax.scatter(ns_book8['발행년도'], ns_book8['출판사']) ax.set_title('출판사별 발행도서') fig.show()3-2. 마커 크기와 색상으로 정보 추가하기

산점도의 각 점을 마커(marker)라고 합니다.
마커의 크기를 조절하는 s 매개변수와 색상을 조절하는 c 매개변수를 사용하여 '대출건수'라는 추가 정보를 시각화할 수 있습니다.
fig, ax = plt.subplots(figsize=(10, 8)) # s: 마커 크기, c: 마커 색상, alpha: 투명도, edgecolors: 테두리색 ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], s=ns_book8['대출건수']*2, # 대출건수가 많을수록 마커가 커짐 c=ns_book8['대출건수'], # 대출건수가 많을수록 색상이 진해짐 alpha=0.3, edgecolors='k', linewidths=0.5, cmap='jet') # 컬러맵 지정 ax.set_title('출판사별 발행도서') fig.show()3-3. 컬러바(Colorbar) 활용하기

마커의 색상이 어떤 값을 의미하는지 명확히 보여주기 위해 컬러바를 추가할 수 있습니다.
fig.colorbar() 함수를 사용하며, scatter 함수의 반환값을 인자로 넘겨줍니다.
fig, ax = plt.subplots(figsize=(10, 8)) sc = ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], s=ns_book8['대출건수']**1.3, # 거듭제곱으로 크기 차이를 더 강조 c=ns_book8['대출건수'], cmap='jet', alpha=0.3, edgecolors='k', linewidths=0.5) ax.set_title('출판사별 발행도서') fig.colorbar(sc) # sc 객체를 이용해 컬러바 생성 fig.show()
4. Matplotlib 고급 기능 활용
4-1. 하나의 Figure에 여러 그래프 그리기 (선, 막대)

ax.plot()이나 ax.bar()를 여러 번 호출하면 하나의 Axes에 여러 그래프를 겹쳐 그릴 수 있습니다.
각 그래프를 구분하기 위해 label을 지정하고 ax.legend()를 호출하여 범례를 표시합니다.
# (데이터 준비 과정 생략) # 여러 개의 선 그래프 fig, ax = plt.subplots(figsize=(8, 6)) for pub in top30_pubs.index[:5]: # 상위 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() # 나란히 배치된 막대 그래프 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()4-2. 누적 정보를 보여주는 스택 그래프 (영역, 막대)

스택 그래프는 전체 크기와 함께 각 부분의 기여도를 시간에 따라 보여줄 때 유용합니다.
ax.stackplot()으로 영역 그래프를, ax.bar()의 bottom 매개변수로 막대 그래프를 그릴 수 있습니다.
# (데이터 준비 과정 생략) # 스택 영역 그래프 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()4-3. 비율을 보여주는 원 그래프 (파이 차트)

ax.pie()를 사용하면 전체에 대한 각 항목의 비율을 시각적으로 표현할 수 있습니다.
autopct로 백분율을 표시하고, explode로 특정 조각을 강조할 수 있습니다.
data = top30_pubs[:10] labels = top30_pubs.index[:10] fig, ax = plt.subplots(figsize=(8, 6)) ax.pie(data, labels=labels, startangle=90, # 시작 각도 autopct='%.1f%%', # 백분율 표시 (소수점 1자리) explode=[0.1]+[0]*9) # 첫 번째 조각만 분리 ax.set_title('출판사 도서비율') fig.show()4-4. 서브플롯으로 여러 그래프 한 번에 배치하기

plt.subplots(nrows, ncols)를 사용하면 하나의 Figure를 여러 개의 Axes로 나눌 수 있습니다.
이를 서브플롯(subplot)이라 하며, 다양한 종류의 그래프를 한눈에 비교할 수 있도록 배치할 때 유용합니다.
fig, axes = plt.subplots(2, 2, figsize=(20, 16)) # 2x2 서브플롯 생성 # axes[0, 0]에 산점도 그리기 # axes[0, 1]에 스택 영역 그래프 그리기 # axes[1, 0]에 스택 막대 그래프 그리기 # axes[1, 1]에 원 그래프 그리기 # (상세 코드는 생략) fig.savefig('all_in_one.png') # 전체 그래프를 이미지 파일로 저장 fig.show()
5. 더 간편한 시각화: Pandas 플롯 기능
Pandas의 DataFrame은 Matplotlib을 기반으로 한 자체 플롯 기능을 내장하고 있습니다.
df.plot.area(), df.plot.bar()등 직관적인 메서드를 사용하여 데이터를 적절한 형태로 재구성(pivot_table 등)하면 더 간편하게 그래프를 그릴 수 있습니다.
# (데이터 준비 과정 생략) # Pandas로 스택 영역 그래프 그리기 fig, ax = plt.subplots(figsize=(8, 6)) ns_book11[top10_pubs].plot.area(ax=ax, title='년도별 대출건수', xlim=(1985, 2025)) ax.legend(loc='upper left') fig.show()
마치며: 데이터의 스토리를 만드는 시각화 기술
이번 포스팅에서는 Matplotlib의 객체지향 API를 중심으로 산점도, 다중 그래프, 스택 그래프, 원 그래프 등 다양한 시각화 기법을 살펴보았습니다. 각 그래프의 특성을 이해하고 데이터에 맞는 시각화 방법을 선택하는 것은 효과적인 데이터 분석의 핵심입니다.
오늘 배운 기능들을 활용하여 여러 그래프를 조합하고 꾸며보면서 자신만의 데이터 스토리를 만들어 보세요.
잘 만들어진 그래프 하나는 긴 설명보다 더 강력한 설득력을 가집니다!
코드 출처:
https://colab.research.google.com/github/rickiepark/hg-da/blob/main/06-1.ipynb
06-1.ipynb
Run, share, and edit Python notebooks
colab.research.google.com
https://colab.research.google.com/github/rickiepark/hg-da/blob/main/06-2.ipynb
06-2.ipynb
Run, share, and edit Python notebooks
colab.research.google.com
강의 출처:
https://www.youtube.com/watch?v=XD65UhBMOiI&list=PLVsNizTWUw7FGzSRCkQrPEEe-ljVXgS7k&index=12
https://www.youtube.com/watch?v=NTQ5NXelOfw&list=PLVsNizTWUw7FGzSRCkQrPEEe-ljVXgS7k&index=13
'Study > Data Analysis' 카테고리의 다른 글
혼자 공부하는 데이터 분석 CH 07 통계와 머신러닝 (0) 2025.09.27 혼자 공부하는 데이터 분석 CH 05 데이터 시각화 (3) 2025.09.25 혼자 공부하는 데이터 분석 CH 04 통계와 분포 (0) 2025.09.24 혼자 공부하는 데이터 분석 CH 03 데이터 클렌징 (1) 2025.09.23 혼자 공부하는 데이터 분석 CH 02 웹 스크래핑 (0) 2025.09.22