반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍10 - 격자 표시 및 x축과 그래프로 둘러싸인 부분 색으로 채우기




8편의 코드에서 야후의 Open API를 이용해 주식정보를 받아오는 코드를 별도의 파일 stockreader.py로 만들어서 다른 코드에서 재사용할 수 있도록 했습니다. 첨부로 파일을 올려 두었으니 필요하신 분은 사용하세요~


stockreader.py의 getStockData() 함수를 재사용하게 될 것이며, 이 함수의 인자는 2개로 하나는 종목코드, 나머지 하나는 주식 데이터를 뽑을 기간입니다. 뽑을 기간은 현재 기준으로 삼성전자 주가 데이터을 1년, 3년, 1달, 3달치를 각각 얻고 싶으면 아래와 같이 호출하면 됩니다.


# 현재기준 1년치, 3년치 삼성전자 주가 데이터를 가져와 data1, data2에 할당함  

>>> import stockreader

>>> data1 = stockreader.getStockData('005930', '1y')

>>> data2 = stockreader.getStockData('005930', '3y')


# 현재기준 1달치, 3달치 삼성전자 주가 데이터를 가져와 data3, data4에 할당함  

>>> import stockreader

>>> data3 = stockreader.getStockData('005930', '1m')

>>> data4 = stockreader.getStockData('005930', '3m')



getStockData의 두 번째 인자를 지정하지 않으면 디폴트로 10년치 주가 데이터를 가져옵니다.


Matplotlib 강좌를 하면서 각종 그래프를 그릴 때 아무것도 없는 백지에다 그렸습니다. 하지만 1년치 주가정보와 같이 값을 확인해야 할 필요가 있는 경우, 모눈종이처럼 격자가 있으면 확인하기가 편리할 겁니다.


자, 다음의 코드를 보시죠~




전편 코드와 비교해서 달라진 부분만 살펴봅니다.


>>> krfont = {'family': 'NanumGothic', 'weight':'bold', 'size':10}

>>> matplotlib.rc('font', **krfont)


Matplotlib에 한글을 표시할 수 있도록 matplotlib에 한글 폰트를 지정해줍니다. 'family'의 값으로 폰트 파일의 이름을 써주시면 됩니다. 우분투의 경우 폰트 디렉토리 위치는 아래와 같으니 폰트파일(.ttf)을 이곳에 복사하면 됩니다.


/usr/share/fonts/trutype/



>>> date, closep, high, low, openp, volume = stockreader.getStockData(compcode, 1)


compcode에 해당하는 주가 데이터의 1년치를 가져옵니다.



>>> ax = plt.subplot2grid((1,1), (0,0))


루트 플롯을 1 x 1로 구분한 서브 플롯을 생성하고 루트 플롯의 (0, 0)에 위치킵니다. 즉, 서브 플롯은 루트 플롯과 그 크기가 동일합니다. 우리는 여태 matplotlib의 루트 플롯에 그래프나 차트를 그리고 화면에 출력했습니다. subplot2grid()는 루트 플롯에 서브 플롯을 지정해줍니다. 루트 플롯은 하나밖에 안되지만 서브 플롯은 여러개가 될 수 있습니다. 이는 UI 프로그래밍을 할 때 루트 프레임을 여러 개의 서브 프레임으로 나누고 서브 프레임에 다양한 위젯을 위치시키는 원리와 비슷합니다. 이해를 돕기 위해 아래의 코드를 봅니다.


>>> ax1 = plt.subplot2grid((3,3), (0,0), colspan=3)

>>> ax2 = plt.subplot2grid((3,3), (1,0), colspan=2)

>>> ax3 = plt.subplot2grid((3,3), (1,2), rowspan=2)

>>> ax4 = plt.subplot2gird((3,3), (2,0))

>>> ax5 = plt.subplot2grid((3,3), (2,1))


위 코드는 루트 플롯을 3 x 3, 9개의 영역으로 구분하고 ax1~ax5에 해당하는 서브 플롯을 정의해주는 코드입니다. 이 코드를 실행하면 matplotlib의 루트 플롯은 아래의 그림과 같이 5개의 서브 플롯으로 구분됩니다.



ax1~ax5는 플로팅을 위한 독립적인 공간이 됩니다. 따라서 무엇을 어떻게 어떤 배치로 나타낼 것이다라는 것을 미리 스케치한 후 matplotlib의 서브 플롯을 적절하게 구성하여 그에 맞는 차트나 그래프를 그려주면 됩니다.


우리의 코드에서는 루트 플롯과 같은 크기의 서브 플롯을 생성했습니다.



>>> ax.plot_date(date, closep, '-')


서브 플롯 ax에 시간별 주식 종가를 선으로 그려줍니다.



>>> for label in ax.xaxis.get_ticklabels():

            label.set_rotation(45)


서브 플롯 ax의 x축의 라벨을 45도 각도로 틀어줍니다.



>>> ax.grid(True)


서브 플롯 ax에 격자를 보이게 합니다.



>>> plt.subplots_adjust(left=0.1, bottom=0.2, right=0.95, top=0.9, wspace=0.2, hspace=0)


서브 플롯간의 간격을 조정해줍니다. 이번 코드는 서브 플롯이 하나이므로 루트 플롯과의 간격이 됩니다. 이 값을 조정해보면 어떤 내용인지 이해할 수 있습니다.



이제 주가 그래프의 아랫 부분을 색으로 채워 보겠습니다.




처음 코드에서 한 줄이 추가되었습니다.


>>> ax.fill_between(date, 1000000, closep)


fill_between(date, 1000000, closep)는 x값은 date이고, 1000000 이상 closep 이하 부분을 디폴트 색상인 파란색으로 채웁니다. 만약 1000000을 500000으로 줄여서 다시 그려보면 아래의 그림과 같이 나옵니다.




이는 y값의 범위가 달라져서 원래의 스케일과는 좀 다르게 나타납니다. 경계부분의 트렌드는 비슷한데 상대적인 차이가 줄어든 것입니다.


채우는 색상을 변경하고자 하면 아래와 같이 하면 됩니다. 아래는 cyan으로 채우고 그리는 색을 변경합니다.


>>> ax.fill_between(date, 1000000, closep, color='c')

>>> ax.plot_date(date, closep, '-', color='c')


결과는 아래와 같이 출력됩니다.





아래 코드는 부분을 칠하는 방법입니다. 물론 이는 정상적인 방법이 아닐 수 있습니다. 코드에 대한 설명은 생략합니다.





반응형

+ Recent posts