파이썬 그래프의 제목, 축 이름, 눈금값, 범례의 내용이 길거나 구분을 위해 여러 줄로 나타내는 방법을 설명합니다.
파이썬 부록 G는 저자의 책 《파이썬으로 그려보는 투자 포트폴리오 분석 - 정량적 투자 분석을 위한 입문서》의 부록에 해당됩니다. 그중에서 투자 성과 분석과 직접적인 관련이 없는 파이썬 그래프 관련 팁을 모았습니다. 해당 책에서 설명한 내용을 중복하여 소개하지는 않습니다.
주의: 이 글은 특정 상품 또는 특정 전략에 대한 추천의 의도가 없습니다. 이 글에서 제시하는 수치는 과거에 그랬다는 기록이지, 앞으로도 그럴 거라는 예상이 아닙니다. 분석 대상, 기간, 방법에 따라 전혀 다른 결과가 나올 수 있습니다. 데이터 수집, 가공, 해석 단계에서 의도하지 않은 오류가 있을 수 있습니다. 일부 설명은 편의상 현재형으로 기술하지만, 데이터 분석에 대한 설명은 모두 과거형으로 이해해야 합니다.
그래프 제목과 축 이름을 여러 줄로 나타내기
다음은 SPY와 QQQ 주가를 불러와서 로그 스케일로 그래프를 그리는 파이썬 코드입니다.
from matplotlib.ticker import PercentFormatter
df = fdr.DataReader('SPY, QQQ').dropna()
df /= df.iloc[0]
df.plot()
plt.yscale('log', base = 2)
plt.xticks(rotation = 0)
plt.gca().yaxis.set_major_formatter(PercentFormatter(xmax = 1, decimals = 0))
title1 = 'SPY와 QQQ의 누적 수익률'
title2 = f'{df.index.min().strftime("%Y-%m-%d")} - {df.index.max().strftime("%Y-%m-%d")}'
plt.title(title1 + '\n' + title2)
plt.ylabel('누적 수익률\n(로그 스케일, 밑 = 2)')
plt.show()
그래프의 제목과 y축 이름을 설정할 때 새줄 문자(개행 기호; 줄 바꿈 기호; new line character)인 '\n'을 사용하면, 이후 내용은 다음 줄에 표시됩니다.
title1 = 'SPY와 QQQ의 누적 수익률'
title2 = f'{df.index.min().strftime("%Y-%m-%d")} - {df.index.max().strftime("%Y-%m-%d")}'
plt.title(title1 + '\n' + title2)
plt.ylabel('누적 수익률\n(로그 스케일, 밑 = 2)')
그래프 제목의 첫 줄은 title1에 두 번째 줄은 title2에 넣었고, 두 문자열을 '\n'으로 연결했습니다. 세로축 제목을 지정하는 plt.ylabel()은 두 문자열을 만들어서 붙이지 않고, 한 문자열 안에 새줄 문자를 넣었습니다.
다음과 같은 그래프가 그려집니다.
파이썬은 문자일 일부에 대해서만 다른 서체로 지정할 수 없습니다. 제목의 경우 첫 줄은 크게 쓰고 두 번째 줄은 작게 쓸 수 없습니다. 하지만 plt.suptitle()이라는 함수가 있습니다. 제목 위에 붙은 큰 제목입니다. 참고: subtitle이 아니라 suptitle입니다.
다음과 같이 코드를 바꾸어 실행해 보겠습니다.
title1 = 'SPY와 QQQ의 누적 수익률'
title2 = f'{df.index.min().strftime("%Y-%m-%d")} - {df.index.max().strftime("%Y-%m-%d")}'
plt.suptitle(title1, fontsize = 'x-large', weight = 'bold')
plt.title(title2)
plt.suptitle()의 기본 글꼴 크기는 'large'입니다. 좀 더 크게 나타내기 위해 'x-large'를 설정했습니다. 'small', 'medium', 'large', 'x-large', 'xx-large', 'larger', 'smaller'를 사용하거나 서체 크기를 포인트(point; pt) 단위로 지정할 수 있습니다.
굵기도 기본인 'normal'보다 더 굵은 'bold'를 지정했습니다. 'normal', 'bold', 'bolder', 'lighter'를 지정할 수 있으며, 500을 기준으로 하는 서체 굵기를 숫자로 지정할 수도 있습니다.
가로축과 세로축의 경우에도 supxlabel()과 supylabel()이 있지만, 이는 plt.supxlabel(), plt.supylabel()로 사용하는 것이 아니라, Figure 객체에 대해 사용하는 함수입니다. 조금 번거롭기도 하고 원하는 대로 설정하기도 불편합니다. 이에 대한 설명은 생략합니다.
눈금값과 범례를 여러 줄로 나타내기
눈금값에 대해서도 새줄 문자를 넣어 여러 줄로 나타낼 수 있습니다. 세로축 눈금과 눈금값을 다음과 갈이 설정해 보겠습니다.
yticks = 2.0 ** np.arange(-1, 5)
plt.yticks(yticks, [f'{(y - 1) * 100:.0f}%\n$2^{{{np.log(y) / np.log(2):.0f}}}$' for y in yticks])
각 눈금값은 퍼센트로 표시된 수익률과 LaTeX 문법으로 나타낸 지수 형식의 자산비입니다. 다음과 같은 그래프가 그려집니다.
세로축 눈금값으로 첫 줄에 수익률이, 두 번째 줄에 지수 형식의 자산비가 표시되었습니다.
LaTex 형식을 이용하면 이 예와 같이 위첨자 또는 아래첨자로 글자를 나타낼 수 있습니다. 위치가 바뀌기는 하지만 기본 글자 크기보다 작은 크기로 글자를 표현할 수 있습니다. 아쉽게도 파이썬의 기본 수학 글꼴은 한글이 지원되지 않습니다.
다음은 범례에 각 ETF의 정식 명칭을 작은 글자로 함께 표시하는 예제입니다.
plt.legend(['SPY\n$^\\text{SPDR S&P 500 Trust ETF}$', 'QQQ\n$^\\text{Invesco QQQ Trust, Series 1}$'])
달러($) 기호로 LaTeX 형식의 시작과 끝을 표시합니다. ^ 기호는 위첨자를 의미하고, \text{내용}는 LaTeX에게 '내용'을 수학 기호가 아닌 글자로 해석하라는 의미입니다. 다음과 같은 결과가 나타납니다.
정리하며
파이썬 그래프를 그릴 때 그래프 제목, 축 이름, 눈금값, 범례를 여러 줄로 나타내는 방법을 알아보았습니다. 새줄 문자인 '\n'을 사용할 수 있으며, 그래프 제목의 경우 큰제목을 설정할 수 있는 함수가 따로 제공됩니다.
중요하지는 않지만 표시해야 하는 정보가 많은 경우, LaTeX 형식으로 위첨자 또는 아래첨자로 글자를 작게 나타낼 수도 있습니다. 특히 눈금값이나 범례에 사용하면 유용합니다. 아쉽게도 LaTeX 형식은 한글을 지원하지 않습니다.
참고 도서:
목차: [연재글 목차] 투자 성과 분석 (기초편, 초급편, 중급편): 순서대로 차근차근 읽으면 좀 더 이해가 쉽습니다.
함께 읽으면 좋은 글 (최신 글)
- [중급 37] 로그 스케일 그래프는 어떻게 해석할 수 있을까? (투자 기간의 변화로 이해해 보자)
- [중급 36] 로그 수익률(log return)의 본질은 무엇일까? (수익률이 아니지만 수익률로 간주할 수 있는 이유는 무엇일까?)
- [중급 35] 로그 정규 분포 (투자에서 로그 정규 분포가 필요한 이유)
- [중급 34] 로그와 로그 스케일 (투자 분석에서 로그의 의미와 로그를 사용하는 이유)
- [중급 33] 투자 성과는 왜 예측하기 어려울까? (중심 극한 정리가 성립하지 않는 투자 수익률)
함께 읽으면 좋은 글 (인기 글)
'파이썬' 카테고리의 다른 글
야후 파이낸스 수정 주가 오류 (일부 분배/배당 내역 누락으로 인한 부정확한 TR값) (0) | 2024.06.29 |
---|---|
코스피/코스닥의 시총과 지수 변화 (2001년 6월 ~ 2023년 12월) (0) | 2024.01.04 |
시가총액 데이터셋(marcap)을 사용해 보자 (파이썬) (0) | 2024.01.04 |