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

[matplotlib 기초] 눈금/눈금선 커스터마이징 | ax.tick_params, ax.set_xticks

꼬예 2021. 4. 22.

 

많은 분들이 matplotlib을 이용할때 y축 눈금을 없애고 싶기도하고, 눈금선을 진하게 만들고 싶기도하고 본인이 원하는대로 커스터 마이징을 하고싶은데 막막하셨을 겁니다. 

 

이번시간을 통해서 완벽하게 커스터마이징 능력을 키워보아요!

 

 

 

 

ax.tick_params

1. 눈금 레이블/글자 크기 조절

import matplotlib.pyplot as plot

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

ax.tick_params(labelsize=20)

output :

디폴트 값으로 적용시 label 크기는 x, y축 label에 모두 적용됩니다.

x 나 y축만 적용하고 싶다면..?

import matplotlib.pyplot as plt

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

ax.tick_params(axis = 'x',
                labelsize=20)

output :

axis = 'x'를 추가하여 적용해주면 x축만 변하게 됩니다. 반대로 y축만 변하게 하고싶다면 axis = 'y'를 적용해주면 되겠죠?

 

2. 눈금선 길이 변경

import matplotlib.pyplot as plot

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

ax.tick_params(labelsize=20,
              length=20)

output :

이번에는 axis 를 디폴트로 지정(x,y축 다 적용)하였고 length=20 을 추가함으로써 눈금선의 길을 늘여보았습니다.

 

 

3. 눈금선 두께 변경

 

import matplotlib.pyplot as plot

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

ax.tick_params(labelsize=20,
              length=20,
              width=3)  

output :

이번에는 width를 추가하였습니다. 모두 직관적이죠?

fig 사이즈가 커질경우 눈금선이 안보일 경우가있기때문에 길이와 두께를 조절한다면 아주 유용합니다.

 

4. 눈금선 없애기

import matplotlib.pyplot as plot

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

ax.tick_params(labelsize=20,
              length=20,
              width=3,
              bottom=False) 

output :

상황에따라 눈금선을 없애버리고 싶을때가 있습니다. 이때는 원하는 방향, 여기선 밑에부분을 없애고 싶기때문에 bottom = False 를 지정하였습니다. 

만약 위를 원한다면 top , 오른쪽은 right, 왼쪽은 left를 false로 지정하면 되겠습니다.

 

5. 눈금선 없애기

import matplotlib.pyplot as plot

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

ax.tick_params(labelsize=20,
              length=20,
              width=3,
              bottom=False,
              labelbottom=False) 

output :

이번엔 눈금선에 이어 눈금 라벨까지 지워보겠습니다. 코드를 보시면 labelbottom=False 라고 되어있죠?

bottom과 마찬가지로 labeltop, labelright,labeleft 등으로 원하는 방향의 라벨또한 지울 수 있습니다. 

 

참고로 눈금선과 라벨을 한번에 지우고싶다면  위 방법보단 아래 방법이 더 효율적입니다.

import matplotlib.pyplot as plot

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

ax.tick_params(labelsize=20,
              length=20,
              width=3)

ax.get_xaxis().set_visible(False)

output :

 

 

ax.get_xaxis().set_visible(False)를 코드에 추가함으로써 간단히 같은 결과를 출력했습니다.

만약 y축도 없애주고싶다면 ax.get_yaxis().set_visible(False)를 추가해주면 됩니다.

 

 

6. 눈금선/라벨 위치 변경

기본적으로 눈금선/과 라벨은 위 그래프들처럼 left가 y축 bottom이 x축인데요. x축이 bottom이 아닌 top으로 y축을 left가 아닌 right로 변경해보겠습니다.

import matplotlib.pyplot as plot

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

ax.tick_params(labelsize=20,
              length=20,
              width=3,
              bottom = False, labelbottom = False,
              left = False, labelleft = False,
              top = True, labeltop=True, 
               right= True, labelright=True
              )

output :

 

지금까지는 없애기 위해 false만 사용했다면 이제는 생기게 하기위해 True를 사용했습니다. 

코드를 보시면 모두 직관적으로 이해가 되실거라 생각하고 자세한 설명은 생략하겠습니다.

 

6. 눈금 레이블 텍스트 회전

라벨이 길어질경우 글자들이 겹쳐 알아보기 힘든 경우가 있습니다. 

일반적으로 라벨이 겹치는 경우는 x축이므로 이번에는 x축에만 적용해보겠습니다. 

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10,10))
ax.tick_params(axis='x',
               labelsize=20,
              length=10,
              width=3,
              rotation=30)

output :

참고로 rotation은 기본적으로 시계반대방향으로 회전을 합니다.. 시계방향으로 회전하고 싶으면 -를 붙혀주면 됩니다.

 

7. 눈금 레이블 컬러 변경

컬러를 변경할때는 눈금선과 라벨이 구분되어 있습니다.

눈금선의 컬러를 바꾸고싶다면 color,  라벨의 컬러를 바꾸고싶다면 colors를 지정해주면됩니다. 코드를 확인해보죠.

import matplotlib.pyplot as plt

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


ax.tick_params(axis = 'x',
              labelsize=20,
               length=20,
               rotation=40,
              color = 'red',
              colors = 'blue')

output :

보시는것처럼 color ='red'로 지정하니 눈금의 색이 빨간색으로 변경되었고, colors ='blue'로 지정하니 라벨값들의 색이 파란색으로 변경된것을 확인할 수 있습니다.

 

그런데... 두개다 같은컬러로 지정할거라면  매번 귀찮게 color, colors를 지정해줘야 할까요? 

고맙게도 matplotlib에서는 color를 따로지정하지 않고 colors만 지정해주면 둘다 같은 색으로 변경되니 이 부분도 챙겨가시면 좋겠습니다.

 

set_xticks, set_yticks 기본 개념

지금까지는 라벨값들을 따로 지정하지 않아 랜덤으로 지정이 되었습니다. 

이 값들을 우리가 원하는 값들로 바꿀순 없을까요? 그 때 사용하는게 set_xticks 와 set_yticks입니다. 

둘다 사실 x축에 적용하나 y축에 적용하나 차이이기때문에 이제부턴 set_xticks를 기준으로 설명하겠습니다.

import matplotlib.pyplot as plt

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

xticks = [i for i in range(10)]
ax.set_xticks(xticks)
ax.tick_params(labelsize=20)

output :

set_xticks()안에 원하는 라벨들을 리스트형태로 넣어주면 됩니다. 

일반적으로 xticks란는 변수명으로 리스트를 만드는것도 참고하시면 좋을것같아요!

 

+보너스

set_xlim/ set_ylim하고는 무슨 차이인가요?

set_xlim, set_ylim는 내가원하는 범위를 리스트로 넣어주는 형태입니다. 

즉 최소, 최대값은 지정가능하나 그 중간에 있는 값들은 커스터마이징 할 수 없죠.

예를 들어 [0,3,4,8,10] 이렇게 규칙성이 없는 값들은 set_xticks나 set_yticks만 사용가능합니다. 

 

set_xticks, set_yticks을 이용하여 작은 눈금(minor ticks) 만들기

우리는 때로 라벨들 사이에 숫자는 표시되어있지 않지만 작은 눈금선들을 만들고 싶습니다. 

아래그림  처럼요!

어떻게 할까요? 이때 등장하는것이 minor ticks 입니다. 

minor ticks도 기존에 tick들을 만들었던것처럼 리스트를 만들어줍니다.  차이는 코드로 확인해보겠습니다. 

import matplotlib.pyplot as plt

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

major_xticks = [i for i in range(0,101,20)]
minor_xticks = [i for i in range(0,101,5)]

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

ax.tick_params(axis='x',
              labelsize=20,
              length=10,
              width=3,
              rotation=30)
ax.tick_params(axis='x',
               
               which='minor', # which 에 minor 적기
              length=5,
              width=2
             )

output :

코드를 보니 감이 좀 오시나요?

가운데 작은 눈금선들을 만들기위해선  major_xticks와 minor_xticks 두개 리스트를 만들어줘야 합니다. 

그리고 각각의 xticks 리스트들은  (0, 101, step) step부분을 조절하여 원하는 눈금선 형태를 만들 수있지요.

(minor_xticks가 사이에 더많은 선들이 있어야하니 step이 더작은걸 확인할수있죠? )

 

리스트를 만든 후에는 set_xticks를 두번 적용해주는데, minor ticks를 적용하는 부분은 "minor = True"를 넣어줘야 합니다. 

 

마찬가지로 tick_params 도 두번 지정해주는데 이때는  'minor = True'가 아닌 which = 'minor'을 지정하면 됩니다. 

 

 

set_xticklabels | set_yticklabels 이용하여 라벨에 글자 넣기

지금까지 set_xticks를 이용하여 원하는 라벨을 지정해보았는데요! 숫자대신 글자로 이루어진 리스트를 넣으면 글자가 출력될까요??

import matplotlib.pyplot as plt

xticks = ['hello','hi','bye' ]

fig, ax = plt.subplots(figsize=(7,7))
ax.set_xticks(xticks)
ax.tick_params(labelsize=20,
              rotation=60)

output :

 

'NoneType' object has no attribute 'update'라는 에러가 뜨네요..

그럼 x축에 글자로 이루어진 라벨은 어떻게 넣을까요?

그때 사용하는것이 set_xticklabels 입니다. (y축은 set_yticklabels입니다.)

 

set_xticklabels를 이용하실때 주의하실점은 먼저 xticks를 지정해주어야 한다는점입니다

쉽게말해 set_ticks를 통해 도화지를 깔고 거기에 그림을 그릴 준비를 해준다고 보면 됩니다.:)

import matplotlib.pyplot as plt

xticks = [i for i in range(10)]
xtick_labels = ['Class ' + str(i) for i in xticks]

fig, ax = plt.subplots(figsize=(7,7))
ax.set_xticks(xticks)
ax.set_xticklabels(xtick_labels)
ax.tick_params(labelsize=20,
              rotation=60)

output :

 

 

코드를 보시는것처럼 xticks를 먼저 지정한 후 그다음 xtick_labels 리스트를 만들었습니다.

해당코드에는 xticks에서 for문을 돌아 stick_labels를 채웠는데요.

두 리스트의 갯수만 같다면 굳이 xticks를 이용해서 xtick_labels를 만들 필요는 없습니다.

그다음으로는 set_xticklabels()를 통해 만든 리스트를 넣어주면 끝입니다. 

 

 

1. 라벨 위치 변경(ha = center/right/left)

set_xticklabels의 유용한 기능으로 글자를 위치를 좀더 세밀하게 조정할 수있는데요! 

무슨말인지는 코드를 통해 확인하시죠!

 

import numpy as np
import matplotlib.pyplot as plt

yticks = np.arange(0.4, 0.54, 0.02)
xticks = [i for i in range(8)]
xtick_labels=[ " ",
            "FC-Agg 1 layer",
            "FC-Agg 2 layer",
            "Topo-Agg 0-hop",
            "Topo-Agg 0-hop test only",
            "Topo-Agg 1-hop",
            "Topo-Agg 2-hop",
            " "]

fig, ax = plt.subplots(figsize=(20,10))
ax.set_yticks(yticks)
ax.set_ylim([0.4,0.52])
ax.set_xticks(xticks)
ax.set_xticklabels(xtick_labels,
                  ha='right')

ax.tick_params(axis='x',
              rotation=20,
              labelsize=15,colors='gray')

ax.tick_params(axis='y',
              labelsize=15,
              colors='gray')

output :

우리가 집중해서 봐야할부분은 set_xtickslabels 부분입니다. ha ='right'라고 보이시나요?

이건 라벨 오른쪽부분은 눈금선에 맞추라는 얘기입니다. 그림을 보시면 감이 오시죠? 글자 오른쪽 끝이 눈금선에 맞춰져습니다. 

만약 왼쪽끝을 맞추고싶다면 ha = 'left'해주면 됩니다. 참고로 디폴트값은 center 입니다.

* ha = horizontal alignment

set_xscale | set_yscale

이번에는 x,y축을 스케일링 하는 법을 알아보겠습니다. 

우선 scaling을 왜 할까요?

 

우리는 데이터간의 특징을 시각적으로 보기 위해 시각화를 하죠.

그런데 데이터값들이 서로 차이가 너무 크면 시각적으로 보기가 불편해집니다. 

이럴때 서로간의 스케일값을 팍 줄여주기 위해 쓰는게 log스케일인데요.

 

자세한건 코드를 통해 보겠습니다. 

 

import matplotlib.pyplot as plt
import numpy as np

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


major_xticks = [10**i for i in range(5)]
ax.set_xticks(major_xticks)

ax.tick_params(labelsize=20,
              which = 'major',
              direction='in',
              length=8)

output :

아래와같이 10의 몇승 형태로 값이 나오는걸 볼 수 있습니다.

 

만약 로그 스케일을 안해준다면.. 아래와 같이 불편한 모습을 만나겠죠?

참고로 scale을 적용하면 위 그림과 같이 minor ticks가 자동적으로 생성이 됩니다. 

자세히보시면 틱들이 일정하지가 않은데요.

 

 

이럴땐 우리가 앞서 배웠던 대로 minor tick을 직접 제작하여 넣어주면 됩니다. 

import matplotlib.pyplot as plt
import numpy as np

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

minor_xtick = np.arange(0,5,0.2)

major_xticks = [10**i for i in range(5)]
minor_xticks = [10**i for i in minor_xtick] # 파이썬 range는 step으로 소수점을 못쓰기때문에 넘파이 array 이용



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

ax.tick_params(labelsize=20,
              which = 'major',
              direction='out',
              length=8)
ax.tick_params(labelsize=0,
              which = 'minor',
              direction='in',  # 삐침이 안쪽으로
              length=8)

output :

x축에 minor tick을 적용해보았습니다. y축 minor tick과는 다르게 이제 일정하게 만들어진것을 볼 수 있습니다. 

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

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

댓글