[Python] Matplotlib으로 데이터 시각화하기
Matplotlib은 Python에서 가장 널리 사용되는 데이터 시각화 라이브러리다.
기본 그래프부터 복잡한 시각화까지 다양한 기능을 제공한다.
기본 그래프 작성
라인 플롯
import matplotlib.pyplot as plt
import numpy as np
# 데이터 준비
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 기본 라인 플롯
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)')
plt.title('Basic Line Plot')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.legend()
plt.grid(True)
plt.show()
다양한 그래프 유형
# 산점도
plt.scatter(x, y, alpha=0.5)
# 막대 그래프
categories = ['A', 'B', 'C', 'D']
values = [4, 3, 2, 5]
plt.bar(categories, values)
# 히스토그램
data = np.random.randn(1000)
plt.hist(data, bins=30)
# 파이 차트
sizes = [15, 30, 45, 10]
labels = ['Group A', 'Group B', 'Group C', 'Group D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
서브플롯 활용
기본 서브플롯
# 2x2 서브플롯 생성
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 첫 번째 행
axes[0,0].plot(x, np.sin(x))
axes[0,0].set_title('Sine')
axes[0,1].plot(x, np.cos(x))
axes[0,1].set_title('Cosine')
# 두 번째 행
axes[1,0].scatter(x, np.random.randn(100))
axes[1,0].set_title('Scatter')
axes[1,1].hist(np.random.randn(1000))
axes[1,1].set_title('Histogram')
plt.tight_layout()
plt.show()
복잡한 레이아웃
# GridSpec 활용
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(3, 3)
# 불규칙한 크기의 서브플롯
ax1 = fig.add_subplot(gs[0, :]) # 첫 행 전체
ax2 = fig.add_subplot(gs[1, :-1]) # 두 번째 행, 마지막 열 제외
ax3 = fig.add_subplot(gs[1:, -1]) # 마지막 열, 첫 행 제외
ax4 = fig.add_subplot(gs[-1, 0]) # 마지막 행, 첫 열
ax5 = fig.add_subplot(gs[-1, -2]) # 마지막 행, 마지막에서 두 번째 열
커스텀 스타일링
색상과 스타일
# 선 스타일 변경
plt.plot(x, y, color='red', linestyle='--', linewidth=2, marker='o')
# 여러 스타일 동시 적용
plt.plot(x, np.sin(x), 'b-', label='Blue solid')
plt.plot(x, np.cos(x), 'r--', label='Red dashed')
plt.plot(x, -np.sin(x), 'g:', label='Green dotted')
텍스트와 주석
# 텍스트 추가
plt.text(5, 0.5, 'Important Point', fontsize=12)
# 화살표 주석
plt.annotate('Peak', xy=(3, 1), xytext=(4, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05))
# 글꼴 설정
plt.rcParams['font.family'] = 'Arial'
plt.title('Graph Title', fontsize=16, fontweight='bold')
컬러맵과 스타일 시트
# 컬러맵 사용
plt.scatter(x, y, c=y, cmap='viridis')
plt.colorbar()
# 스타일 시트 적용
plt.style.use('seaborn-darkgrid')
# 또는
plt.style.use('ggplot')
인터랙티브 그래프
실시간 업데이트
import matplotlib.animation as animation
fig, ax = plt.subplots()
x_data, y_data = [], []
def update(frame):
x_data.append(frame)
y_data.append(np.sin(frame))
ax.clear()
ax.plot(x_data, y_data)
ani = animation.FuncAnimation(fig, update, frames=np.linspace(0, 10, 100),
interval=50)
plt.show()
이벤트 처리
def on_click(event):
if event.inaxes is not None:
print(f'Clicked at x={event.xdata}, y={event.ydata}')
fig.canvas.mpl_connect('button_press_event', on_click)
동적 그래프 업데이트
from IPython.display import display, clear_output
import time
plt.ion() # 인터랙티브 모드 활성화
for i in range(100):
plt.clf() # 이전 그래프 지우기
plt.plot(np.sin(np.linspace(0, 10+i/10, 100)))
plt.draw()
plt.pause(0.1)
시각화 베스트 프랙티스
- 그래프 가독성
- 적절한 폰트 크기 사용
- 명확한 레이블과 범례
- 격자선 활용
- 데이터 표현
- 데이터 특성에 맞는 그래프 선택
- 적절한 스케일 사용
- 오해의 소지가 없는 시각화
- 파일 저장
# 고품질 이미지 저장 plt.savefig('graph.png', dpi=300, bbox_inches='tight') plt.savefig('graph.svg', format='svg') # 벡터 그래픽
'개발&프로그래밍' 카테고리의 다른 글
[python] 파일 입출력 기초 가이드 (1) | 2024.11.20 |
---|---|
[python] 리스트와 딕셔너리 완벽 이해하기 (0) | 2024.11.20 |
[Python] Pandas DataFrame (2) | 2024.11.19 |
[Python] NumPy 배열 연산 마스터하기 (0) | 2024.11.18 |
[JAVA] ThreadLocal 제대로 사용하기 (0) | 2024.11.17 |
댓글