2022-07-04 20:32:48

안녕하세요. 비스카이비전입니다. matplotlib의 pyplot 그래프를 그리다보면 내가 원하는 대로 x축, y축의 눈금들이 그려지지 않을 때가 있습니다. 

 

import matplotlib.pyplot as plt

x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022]
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

plt.plot(x, y)
plt.show()

 

 

저는 2010, 2011, 2012, 2013 등 모든 년도마다 눈금이 있었으면 했는데, 하나씩 건너뛰고 눈금이 그려졌습니다. 이럴 때 사용할 수 있는 것이 바로 pyplot의 xticks, yticks 메소드입니다. 참고로 tick은 x축, y축 등에 간격을 표시하기 위해 그려지는 눈금을 뜻합니다. 

 

 

xticks, yticks 메소드

그러면 xticks, yticks 메소드를 활용하여 x축에는 모든 년도, y축에는 1에서 13까지 1 간격으로 눈금이 그려지게 해보겠습니다. 필요한 코드는 다음과 같습니다.

 

import matplotlib.pyplot as plt

x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022]
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

plt.plot(x, y)
plt.xticks(x)
plt.yticks(y)
plt.show()

 

추가된 코드 plt.xticks(x)는 "x 리스트 내 요소들의 위치마다 눈금을 그려줘!"라는 뜻이 됩니다. 마찬가지로 plt.yticks(y)는 "y 리스트 내 요소들의 위치마다 눈금을 그려줘!"라는 의미를 갖습니다. 

 

 

x축, y축 모두 모든 데이터 포인트에 해당하는 지점마다 눈금이 생긴 것을 확인하실 수 있습니다. 그런데 눈금이 촘촘해지다보니 2010, 2011, 2012 눈금 라벨들이 서로 너무 가까워졌습니다. 이런 경우에는 눈금 라벨의 폰트 사이즈를 줄이거나 살짝 회전을 시켜주는 것이 좋습니다.

 

1) x축 눈금 라벨 폰트 사이즈 줄이기

위 코드에서 xticks 관련된 부분만 다음과 같이 수정하시면 됩니다.

 

plt.xticks(x, fontsize=7)

 

 

폰트 사이즈가 줄어들어 조금 더 여백이 생겼습니다.

 

2) x축 눈금 라벨 회전시키기  

폰트 사이즈는 줄이지 않고 눈금 라벨만 회전시켜 가독성을 높여 주는 것도 하나의 방법입니다. 

 

plt.xticks(x, rotation=45)

 

 

3) x축 눈금 라벨 값 변경하기

만약에 2010, 2011, 2012 대신에 2010년, 2011년, 2012년 이런 식의 눈금 라벨이 들어가게 하려면 어떻게 해야할까요? 그때는 labels 매개변수에 대신 들어갈 값들을 리스트의 형태로 전달해주시면 됩니다. 눈금의 개수랑 매칭이 되어야 에러가 발생하지 않습니다. 그래프에 한글이 들어가기 때문에 한글 폰트가 깨지지 않기 위한 코드도 추가했습니다. 

 

import matplotlib.pyplot as plt

# 한글 폰트 사용을 위해서 세팅
from matplotlib import font_manager, rc
font_path = "C:/Windows/Fonts/NGULIM.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022]
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

plt.plot(x, y)
plt.xticks(x, labels=['2010년', '2011년', '2012년', '2013년', '2014년', '2015년', '2016년', '2017년', '2018년', '2019년', '2020년', '2021년', '2022년'], rotation=45)
plt.yticks(y)
plt.show()