본문 바로가기
데이터 분석/시각화

Matplotlib 메인 눈금(Major Tick) 서브 눈금(Minor Tick) 사용하기

by 부자 꽁냥이 2021. 6. 14.

안녕하세요~ 꽁냥이에요. 지난 포스팅에서는 tick_params 이용하여 눈금을 조절하는 방법에 대해서 알아보았습니다. 이번엔 지난 포스팅에서 다루지 않았지만 알아두면 유용한 팁을 알려드리려고 합니다.

 

데이터(특히 시계열 데이터)를 선 그래프로 표현할 때 x축 눈금 라벨이 길어서 겹침 현상이 발생할 때가 있습니다. 아래 그림처럼 말이죠.

 

이러한 문제를 해결하는 방법으로 x축 눈금 라벨을 회전하는 방법이 있습니다(x축 눈금 라벨을 회전하는 방법은 여기에 포스팅해두었습니다).

 

 

하지만 이러한 방법은 불필요하게 x축 눈금을 표시하게 될 수 있습니다. 왜냐하면 위 그림상에서 2018/01/01부터 2018/12/01의 시간 범위에서 2018년이라는 것이 중복되어 있기 때문입니다. 따라서 이러한 x축 눈금은 중간중간 비워놔도 문제가 없습니다. 

 

이때 메인 눈금(Major Tick)과 서브 눈금(Minor Tick)을 이용하면 필요한 부분만 눈금 라벨을 표시하여 좀 더 깔끔한 그래프를 얻을 수 있습니다. 아래 그림은 메인 눈금과 서브 눈금의 개념을 나타낸 것입니다.

 

 

이번 포스팅에서는 메인 눈금과 서브 눈금을 표시하는 방법을 소개하려고 합니다. 여기서 다루는 내용은 다음과 같습니다.

 

1. 눈금이 숫자인 경우

2. 눈금이 날짜인 경우

3. 눈금이 문자인 경우


   1. 눈금이 숫자인 경우

먼저 이번 포스팅에서 사용할 모듈을 임포트해줍시다~~

 

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from matplotlib.ticker import MultipleLocator, IndexLocator, FuncFormatter
from matplotlib.dates import MonthLocator, DateFormatter

 

여기서는 x축 눈금으로 표시할 라벨이 숫자인 경우를 다뤄보도록 하겠습니다. 꽁냥이는 코사인 함수를 그려볼꺼에요. 아래 코드를 살펴보시죠.

 

x = np.arange(0, 30, 0.1)
y = np.cos(0.1 * np.pi * x)

fig = plt.figure(figsize=(8,6))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.plot(x, y)

ax.xaxis.set_major_locator(MultipleLocator(5)) ## x값이 5의 배수일 때마다 메인 눈금 표시
ax.xaxis.set_major_formatter('{x:.0f}') ## 메인 눈금이 표시될 형식

ax.xaxis.set_minor_locator(MultipleLocator(1)) ## 서브 눈금은 x값이 1의 배수인 경우마다 표시

plt.show()

 

line 1~2

x값과 y값을 생성합니다. 코사인을 그릴 것이므로 numpy에서 제공하는 cos함수를 사용했습니다.

 

line 9

꽁냥이는 x값이 5의 배수인 경우만 메인 눈금 라벨을 표시할 거예요. 메인 눈금 라벨의 설정은 

xaxis.set_major_locator을 이용하고요. 이 함수에 주어진 값의 배수마다 메인 눈금 라벨을 표시해주는 MultipleLocator 클래스를 인자로 넘겨주시면 됩니다. 5의 배수마다 눈금 라벨을 표시할 것이므로 MultipleLocator 클래스 인자에 5를 넣어주세요.

 

line 10 

Matplotlib에서는 눈금에 표시될 형식을 지정할 수 있는 xaxis.set_major_formatter 함수를 제공하고 있어요. 꽁냥이는 소수점 자리는 표시하지 않기 위한 포맷을 인자로 넣어주었습니다. 포맷에 대한 정보를 더 자세히 알고 싶으신 분들은 여기를 참고하세요.

 

line 12

서브 눈금은 x값이 1의 배수일 때, 즉 양의 정수일 때만 눈금이 표시되도록 했습니다. 눈금 라벨은 표시하지 않았어요.

 

위 코드를 실행해보세요~

 

 

5의 배수인 경우마다 메인 눈금 라벨이 표시되는 것을 알 수 있습니다.

반응형

   2. 눈금이 날짜인 경우

이번엔 x축이 날짜 타입으로 된 경우를 살펴보겠습니다. 아래 코드를 살펴볼게요.

 

date = pd.date_range(start='2018-01-01', end='2020-01-01', freq='MS') ## M 뒤에 S를 붙이면 월초가 출력된다.
y = abs(10*np.random.randn(len(date))+1)
y = y/max(y)

fig = plt.figure(figsize=(8,6))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.plot(date, y)

ax.xaxis.set_major_locator(MonthLocator(interval=5)) ## 5개월마다 메인 눈금을 표시한다.
ax.xaxis.set_major_formatter(DateFormatter('%Y/%m/%d')) ## 날짜 표시 형식
ax.xaxis.set_minor_locator(MonthLocator(interval=1)) ## 1개월마다 서브 눈금을 표시한다.

ax.yaxis.set_major_locator(MultipleLocator(0.25)) ## y값이 0.25의 배수인 경우마다 메인 눈금 표시
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos:f'{100*x:.0f}%')) ## 메인 눈금 표시형식
ax.yaxis.set_minor_locator(MultipleLocator(0.05)) ## y축 서브 눈금 표시

ax.tick_params(axis='x',which='major',length=10,width=2,color='b')

plt.show()

 

line 1~3

그래프를 그릴 데이터를 생성합니다. 날짜 타입의 데이터를 생성하기 위해 pandas에서 제공하는 date_range 함수를 사용하였습니다.

 

line 10~12

x축의 메인 눈금과 서브 눈금을 설정합니다. 꽁냥이는 매 5개월째 되는 날마다 메인 눈금을 표시하고 싶어서 MonthLocator 클래스를 사용했고 interval 인자에 5를 넣어주었습니다(line 10). 다음으로 눈금 라벨에 표시될 날짜 형식을 지정합니다(line 11). 서브 눈금은 매 1개월마다 표시하도록 설정했습니다(line 12). Matplotlib에서는 날짜에 대한 눈금 처리를 위해 여러 가지 편리한 클래스를 제공하고 있는데요. 이에 대해 자세히 알고 싶으신 분들은 여기를 참고하세요.

 

line 14~16

이번에는 y축에 대해서 메인 눈금과 서브 눈금을 설정했습니다. 이에 대한 설명은 앞에서 했으므로 주석으로 대체하겠습니다.

 

line 18

여기서는 x축 메인 눈금(which='major') 색상을 파란색으로 지정(color='b') 하고 스타일을 tick_params를 통하여 지정해보았습니다. tick_params의 사용법은 여기에 포스팅해두었으니 참고하세요.

 

위 코드를 실행해보세요.

 

 

보시는 바와 같이 5개월마다 메인 눈금 표시되는 것을 알 수 있습니다. 다만 2018/01/01부터 시작하는 것이 아닌 2018/03/01부터 시작하네요. MonthLocator는 시작점과 간격을 동시에 조절할 수 없는 것 같습니다. 만약 아시는 고수님들은 알려주시면 감사하겠습니다 >0<~


   3. 눈금이 문자인 경우

x축 눈금 라벨이 문자인 경우도 메인 눈금과 서브 눈금을 설정할 수 있습니다. 아래 코드는 x축의 경우 첫 번째 눈금부터 시작해서 매 3번째마다 메인 눈금 라벨을 표시합니다. 그 외 나머지 코드 부분은 주석을 참고해주세요.

 

label = list('abcdefghijklmnopqrstuvwxyz')
y = abs(14*np.random.randn(len(label))-7)
y = y

fig = plt.figure(figsize=(8,6))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.plot(label, y)

ax.xaxis.set_major_locator(MultipleLocator(3)) ## x축 첫번째 부터 시작해서 매 3번째 마다 표시
ax.xaxis.set_minor_locator(MultipleLocator(1)) ## 모든 x 위치마다 눈금 표시

ax.yaxis.set_major_locator(MultipleLocator(5)) ## y축 메인 눈금을 5의 배수인 경우만 표시
ax.yaxis.set_minor_locator(MultipleLocator(1)) ## y축 눈금을 1의 배수인 경우만 표시

# 스타일 설정
ax.tick_params(axis='both',which='major',length=10,width=2,color='b')
ax.tick_params(axis='x',which='minor',length=5,width=1,color='r')
ax.tick_params(axis='y',which='minor',length=5,width=1,color='g')
plt.show()

 

 

코드를 실행하면 첫 번째 눈금인 'a' 부터 시작해서 매 3번째 지날때마다 눈금 라벨이 표시되는 것을 알 수 있습니다. 만약 첫번째 눈금이 아니라 3번째 글자인 'c'부터 시작하여 매 3번째마다 메인 눈금을 표시하고 싶다면 어떻게 할까요? 이때에는 IndexLocator 클래스를 사용하면 됩니다. 위 코드 10번째 줄을 다음과 같이 바꿔주세요. 앞의 숫자 3은 눈금이 표시되는 주기이며 뒤의 숫자 2는 시작점을 의미합니다.

 

ax.xaxis.set_major_locator(IndexLocator(3,2))

 

 

코드를 실행하면 'c'부터 시작하여 매 3번째마다 메인 눈금이 표시되는 것을 알 수 있습니다.


이번 포스팅에서는 Matplotlib에서 메인 눈금(Major Tick)과 서브 눈금(Minor Tick)을 지정하는 방법을 알아보았습니다. 사실 이 부분은 많이 사용하지 않지만 알아두면 그래프를 좀 더 깔끔하게 만들 수 있을 거예요. 부디 이번 포스팅이 도움이 되길 바라며 이상 포스팅 마치겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.

 

참고자료

https://matplotlib.org/stable/gallery/ticks_and_spines/major_minor_demo.html

https://matplotlib.org/stable/gallery/text_labels_and_annotations/date.html


 

댓글


맨 위로