무효 클릭 IP 추적 중...
머신러닝,딥러닝/matplotlib 시각화

[matplotlib 기초] grid(그리드) | 격자 사용법

꼬예 2021. 5. 26.

오늘 이시간에는 그래프에서 표안에 그려지는 격자(그리드)를 그리는 법을 배워보겠습니다. 

 

 

디폴트 형태의 그리드 

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

ax.grid() 

output :

그리드는 기본적으로 눈금(ticks)를 기준으로 그려지게 됩니다.

그리드를 좀더 촘촘하게 하려면 tick들을 더 세분화하면 되겠죠?

(tick을 customizing하는법에 대해선 해당 포스트에서 자세히 설명 하였으니 참고바랍니다.)

 

 

X축 | Y축 점선 그리기

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

ax.grid(axis='x')

output :

grid api 인자로 axis = 'x'를 넣어주면 y축은 없어지고 x축만 남게됩니다. 

 

마찬가지로 axis = 'y'를 넣어주면 y축 점섬만 생기겠죠?

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

ax.grid(axis='y')

output :

 

 

점선 두께 조절

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

ax.grid(axis='x',
       linewidth=3)

output :

linewidth = 숫자 를 통해 원하는 두께로 조절이 가능합니다.

 

라인 스타일 변경

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

ax.grid(axis='x',
       linewidth=3,
       linestyle=':')

output :

linestyle = ' ' 에 넣는 값에 따라 다양한 스타일을 연출 할 수있습니다. 

아래 라인 스타일을 확인하시고 필요에 따라 사용하십시오!

라인 컬러 변경

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

ax.grid(axis='x',
       linewidth=3,
       linestyle='-.',
       color = 'r') 

output :

 

color = ' ' 에 인자로 원하는 컬러를 넣으면 됩니다. 

(해당 공식문서를 통해 다양한 컬러명을 확인할 수 있으니 참고 바랍니다.)

 

 

격자 폭 조정 

앞서 말씀드렸듯이 격자선 폭을 조정하기 위해선 눈금(tick)을 조정해줘야 합니다. 

(눈금 커스터마이징 포스트 참조)

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

major_xticks = [i for i in range(0, 101, 10)]
ax.set_xticks(major_xticks)
ax.tick_params(labelsize=20)

ax.grid(axis='x',which='major',
       linewidth=1.5)

output :

set_xticks를 통해 눈금을 많이 지정해주면 그에 따라 grid 즉 격자도 자동적으로 많아지게 됩니다. 

 

 

minor 그리드 | major 그리드

major tick 과 minor tick 을 만들 수있었던것 처럼 그리드도 'minor 그리드', 'major 그리드'를 따로 그려낼 수 있습니다.

방법은 tick 을 만들 때처럼 minor tick major tick 을 먼저 만들어준다음 grid api 인자로 which = 'major', 'minor'을 통해 만들 수 있습니다.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

major_yticks = [i for i in range(0, 101, 20)]
minor_yticks = [i for i in range(0, 101, 5)]
ytick_labels = [str(i)+'%' for i in major_yticks]

ax.set_yticks(major_yticks)
ax.set_yticks(minor_yticks, minor= True)
ax.set_yticklabels(ytick_labels)

ax.tick_params(labelsize=20)

ax.grid(axis='y', which='major',
       linewidth=1.5)


ax.grid(axis='y', which='minor',
       linestyle=':')

output :

which 인자를 통해 major 그리드 minor 그리드 각각 커스터마이징이 가능합니다.

 

스케일 적용시 주의할점

앞선 포스트에서도 한번 말씀드린적이 있는데요

set_xscale or set_yscale을 통해 스케일을 적용할시 minor tick이 저절로 생기게 됩니다. 

아래 코드를 보시죠

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,7))

ax.set_yscale('log')
ax.set_ylim([1, 1E3])

ax.tick_params(labelsize=20,
              length=10)
ax.tick_params(which='minor', # scale적용시 자동으로 마이너가 적용되니 따로 minor set ticks를 할필요 x
              length=5)

ax.grid(axis='y', which='major',
       linewidth=1.5)
ax.grid(axis='y', which='minor',
       linestyle=':')

output :

 

minor tick 이 저절로 적용이 되기 때문에 우리는 임의로 minor ticks를 만들어줄 필요가 없습니다. 

그말은 그리드도 minor 그리드가 저절로 적용이 되기 때문에, which 를 통해 minor 그리드를 커스터마이징 할 수있습니다. 

 

하지만 위 그리드를 보시면 로그 스케일 특성상 일정치 않은 현상이 있습니다. 

이걸 고쳐주기 위해선 어떻게 할까요?

 

minor tick 디폴트 상태를 바꾸기 위해 minor tick을 지정 해주면 됩니다.

 

하지만 스케일이 적용된 상태에서 minor tick 를 그대로 적용하면 글자 겹침 현상이 발생합니다. 

minor tick | major tick 글자 겹침 현상

import matplotlib.pyplot as plt
import numpy as np

fig, ax  = plt.subplots(figsize=(10,10))
ax.set_xscale('log')



major_xticks = [10**i for i in range(5)]
minor_xticks = [10**i for i in np.arange(0,5,0.2)]

ax.set_xticks(major_xticks)
ax.set_xticks(minor_xticks,
             minor=True)

ax.tick_params(labelsize=20)


ax.grid(axis='x', which='major',
       linewidth=1.5)
ax.grid(axis='x', which='minor',
       linestyle=':')

output :

스케일을 적용하지 않을때는 minor tick 라벨들을 신경 써주지 않아도 되지만 스케일을 적용하면 output 같이 글자가 겹치는 현상이 발생합니다. 이럴때는 간단하게 tick_params를 통해 labelsize= 0을 지정해주거나 labelbottom=False 인자를 추가할수도 있습니다.

import matplotlib.pyplot as plt
import numpy as np

fig, ax  = plt.subplots(figsize=(10,10))
ax.set_xscale('log')



major_xticks = [10**i for i in range(5)]
minor_xticks = [10**i for i in np.arange(0,5,0.2)]

ax.set_xticks(major_xticks)
ax.set_xticks(minor_xticks,
             minor=True)

ax.tick_params(labelsize=20)
ax.tick_params(which = 'minor', # minor tick label size 변경
               labelsize=0) # labelbottom=False 해도 상관없음


ax.grid(axis='x', which='major',
       linewidth=1.5)
ax.grid(axis='x', which='minor',
       linestyle=':')

output :

 

 

👉 쥬피터노트북에 chatgpt 적용 하기

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글