프로그래밍/파이썬

matplotlib로 차트 그리기

do121 2024. 6. 21. 07:09

1. 기본 사용법

 

2x2 배열의 서브플롯에 각각 선 그래프, 막대 그래프, 산점도, 히스토그램이 그려집니다. tight_layout() 함수로 서브플롯 간의 간격이 자동으로 조정됩니다.

 

 

import matplotlib.pyplot as plt

# 하나의 Figure와 2x2 배열의 서브플롯 생성
fig, axs = plt.subplots(2, 2)

# 각각의 서브플롯에 접근하여 차트를 그릴 수 있습니다
axs[0, 0].plot([1, 2, 3], [1, 4, 9])
axs[0, 1].bar([1, 2, 3], [1, 4, 9])
axs[1, 0].scatter([1, 2, 3], [1, 4, 9])
axs[1, 1].hist([1, 2, 3, 1, 2, 3, 1, 2, 3])

# 레이아웃 조정
plt.tight_layout()

# 차트 표시
plt.show()

 

2. 다양한 크기의 서브플롯

위쪽 서브플롯에 'First Subplot'이라는 제목의 선 그래프가 그려지고, 아래쪽 서브플롯에 'Second Subplot'이라는 제목의 선 그래프가 그려집니다. tight_layout() 함수로 간격이 자동으로 조정됩니다.

  plt.subplots(2, 1, figsize=(8, 6))

  • plt.subplots(rows, cols, figsize=(width, height))는 rows × cols 배열의 서브플롯을 생성
  1. rows=2: 서브플롯을 세로로 2개 생성
  2. cols=1: 서브플롯을 가로로 1개 생성
  3. figsize=(8, 6): 전체 Figure의 크기를 지정. 여기서 8은 너비(inches), 6은 높이(inches)
import matplotlib.pyplot as plt

# 2x1 배열의 서브플롯 생성
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))

# 첫 번째 서브플롯
ax1.plot([1, 2, 3], [1, 4, 9])
ax1.set_title('First Subplot')

# 두 번째 서브플롯
ax2.plot([1, 2, 3], [9, 4, 1])
ax2.set_title('Second Subplot')

# 레이아웃 조정
plt.tight_layout()

# 차트 표시
plt.show()

 

3. 다양한 배율 설정

첫 번째 서브플롯이 두 번째 서브플롯보다 세 배 높게 그려집니다. 각각의 서브플롯에 제목이 추가됩니다.

import matplotlib.pyplot as plt

# 다양한 높이의 서브플롯
fig, (ax1, ax2) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [3, 1]}, figsize=(8, 6))

# 첫 번째 서브플롯
ax1.plot([1, 2, 3], [1, 4, 9])
ax1.set_title('Taller Subplot')

# 두 번째 서브플롯
ax2.plot([1, 2, 3], [9, 4, 1])
ax2.set_title('Shorter Subplot')

# 레이아웃 조정
plt.tight_layout()

# 차트 표시
plt.show()

 

4. 서브플롯 간의 간격 조정

2x2 배열의 서브플롯 간의 간격이 수평(wspace=0.5), 수직(hspace=0.5)으로 조정되어 더 넓게 표시됩니다.

import matplotlib.pyplot as plt

# 2x2 배열의 서브플롯 생성
fig, axs = plt.subplots(2, 2, figsize=(8, 8))

# 각 서브플롯에 그래프를 그리기
axs[0, 0].plot([1, 2, 3], [1, 4, 9])
axs[0, 1].plot([1, 2, 3], [1, 4, 9])
axs[1, 0].plot([1, 2, 3], [1, 4, 9])
axs[1, 1].plot([1, 2, 3], [1, 4, 9])

# 서브플롯 간의 간격 조정
plt.subplots_adjust(hspace=0.5, wspace=0.5)

# 차트 표시
plt.show()

 

5. 서브플롯에 추가 기능 적용

 

첫 번째 서브플롯과 두 번째 서브플롯에 각각 다른 제목, 축 레이블, 범례, 그리드가 추가됩니다. tight_layout() 함수로 간격이 자동으로 조정됩니다.

import matplotlib.pyplot as plt

# 2x1 배열의 서브플롯 생성
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))

# 첫 번째 서브플롯
ax1.plot([1, 2, 3], [1, 4, 9], label='Line 1')
ax1.set_title('First Subplot')
ax1.set_xlabel('X Axis 1')
ax1.set_ylabel('Y Axis 1')
ax1.legend()
ax1.grid(True)

# 두 번째 서브플롯
ax2.plot([1, 2, 3], [9, 4, 1], label='Line 2', color='r')
ax2.set_title('Second Subplot')
ax2.set_xlabel('X Axis 2')
ax2.set_ylabel('Y Axis 2')
ax2.legend()
ax2.grid(True)

# 레이아웃 조정
plt.tight_layout()

# 차트 표시
plt.show()

6. 상단에 캔들차트, 하단에 선 그래프 그리기

상단에는 캔들차트, 하단에는 종가를 나타내는 선 차트가 하나의 Figure에 그려집니다. 상단 서브플롯의 높이가 하단보다 두 배 크며, 각각의 서브플롯에 제목과 레이블이 추가됩니다.

 

import yfinance as yf
import mplfinance as mpf
import pandas as pd
import matplotlib.pyplot as plt

# yfinance를 사용하여 S&P 500 데이터 다운로드
ticker = '^GSPC'
data = yf.download(ticker, start='2023-01-01', end='2024-01-01')

# Figure와 서브플롯 생성
fig, (ax_candle, ax_line) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [2, 1]}, figsize=(10, 8))

# 캔들차트 스타일 설정
custom_style = mpf.make_mpf_style(base_mpf_style='charles', 
                                  marketcolors=mpf.make_marketcolors(up='g', down='r', wick='i', edge='i'))

# 상단의 캔들차트 그리기
mpf.plot(data, type='candle', ax=ax_candle, volume=False, style=custom_style)
ax_candle.set_title('S&P 500 Candlestick Chart')

# 하단의 선 차트 그리기
x = data.index
y = data['Close']
ax_line.plot(x, y, label='Close Price')
ax_line.set_title('S&P 500 Line Chart')
ax_line.set_xlabel('Date')
ax_line.set_ylabel('Close Price')
ax_line.legend()

# 레이아웃 조정
plt.tight_layout()

# 차트 표시
plt.show()