본문 바로가기
파이썬

여러개의 그래프를 한 번에 그리는 예제

by hustler78 2023. 4. 5.
728x90
반응형

나중에 찾아보기 위한 용도이므로 자세한 설명은 없는 글입니다.

 

 

 

예제

2023.04.04 - [주식분석/Quant 분석(프로그래밍)] - 막힌벽을 강하게 뚫어보자- 222일선 강하게 돌파하는 전략

 

막힌벽을 강하게 뚫어보자- 222일선 강하게 돌파하는 전략

저는 평소에 222일선을 주목합니다. 단타를 지양하고 중장기 투자를 지향하다 보니, 투자자들이 중장기적으로 평균 어느 정도에서 해당 주식을 거래했는지가 궁급합니다. 그러다 보니 1년 주식

sine-qua-none.tistory.com

 

시고저종 캔들차트와 거래량 바차트를 한 화면에 그리고 싶습니다.

그런데 그냥 subplots를 이용하면 두 그래프의 크기가 같게 나옵니다. 그림의 크기를 조절해 보기 위해 Gridspec 이라는 함수를 사용하는 예제입니다.

 

 

python code

 

from mpl_finance import candlestick_ohlc
import matplotlib.dates as mpl_dates
import matplotlib.pyplot as plt
import datetime
from dateutil.relativedelta import relativedelta
import FinanceDataReader as fdr
from matplotlib import gridspec


def load_data(stock_code, start_date, end_date):
    df = fdr.DataReader(stock_code, start_date, end_date)
    return df


def Beat_Ma():
    end_date = datetime.datetime.today()

    start_date = end_date - relativedelta(years=3)

    stk_code = '357550'  # 석경에이티
    stk_code = '001390'  # KG케미칼
    stk_code = '058850'  # KTcs
    stk_code = '014100'  # 메디앙스
    stk_code = '001460'  # BYC
    stk_code = '312610'  # 에이에프더블유
    stk_code = '270520'  # 지앤원에너지

    df = load_data(stk_code, start_date, end_date)
    df.index = df.index.map(mpl_dates.date2num)
    df['Date'] = df.index

    volume_multiplier = 3
    df['Ma222'] = df.Close.rolling(222).mean()

    df= df.copy().tail(200)
    cond1 = df.Open < df.Ma222
    cond2 = df.Close > df.Ma222
    cond3 = df.Volume > volume_multiplier * df.Volume.shift(1)
    cond4 = df.Close - df.Ma222 > df.Ma222 - df.Open

    df['signal'] = cond1 & cond2 & cond3 & cond4


    df_ohlc = df[['Date', 'Open', 'High', 'Low', 'Close']]

	# subplots를 이용한 예제
    fig, ax = plt.subplots(2, 1, sharex=True, figsize=(10, 6))  # share x axis and set a figure size

    candlestick_ohlc(ax[0], df_ohlc.values, width=0.6, \
                     colorup='red', colordown='blue', alpha=0.8)
    ax[0].plot(df.index, df.Ma222)
    ax[1].bar(df.index, df.Volume)
    ax[0].scatter(df[df['signal'] == True].index, df[df['signal'] == True].Close * 1.02,
               marker='o', c='black', label='signal', s=100)
    date_format = mpl_dates.DateFormatter('%y/%b/%d')

    ax[1].xaxis.set_major_formatter(date_format)

    plt.suptitle(f'{stk_code} subplots version')

    plt.show()

    # gridspec를 이용한 예제. height_ratios로 두 행으로 배치된 그림의 크기를 조절함
    fig =plt.figure(figsize=(10,6))
    gs =gridspec.GridSpec(nrows=2, ncols=1, height_ratios=[5,2])
    ax_ohlc = fig.add_subplot(gs[0])
    ax_volume = fig.add_subplot(gs[1], sharex=ax_ohlc)

    candlestick_ohlc(ax_ohlc, df_ohlc.values, width=0.6, \
                     colorup='red', colordown='blue', alpha=0.8)
    ax_ohlc.plot(df.index, df.Ma222, label='MA_222days')
    ax_ohlc.plot(df.index, df.Close, label='close')
    ax_volume.bar(df.index, df.Volume,label='volume')
    ax_ohlc.scatter(df[df['signal'] == True].index, df[df['signal'] == True].Close * 1.02,
               marker='2', c='black', label='signal', s=200)
    date_format = mpl_dates.DateFormatter('%y/%b/%d')

    ax_volume.xaxis.set_major_formatter(date_format)

    ax_ohlc.legend(loc ='upper left')
    ax_volume.legend(loc ='upper left')
    plt.suptitle(f'{stk_code} using gridspec')
    plt.show()


if __name__ == '__main__':
    Beat_Ma()

 

위 코드의 결과입니다.

 

 

첫번째 결과는 위 그림처럼 봉차트와 바차트의 크기가 같게 나옵니다.  봉차트가 더 중요한 정보라고 생각될 때는 gridspec를 이용하여 아래 그림처럼 차트의 크기를 바꿉니다.

 

 

 

 

 

정리

    fig, ax = plt.subplots(2, 1, sharex=True, figsize=(10, 6))  # share x axis and set a figure size
   
    ax[0].plot(x_data, y_data)
    ax[1].bar(x_data, y_data)

 

    fig =plt.figure(figsize=(10,6))
    gs =gridspec.GridSpec(nrows=2, ncols=1, height_ratios=[5,2])
    ax0 = fig.add_subplot(gs[0])
    ax1 = fig.add_subplot(gs[1], sharex=ax0)



 

 

 

 

 

728x90
반응형

댓글