[Matplotlib] 04. Axes Setup: Ticks and Tick Labels

in #kr-dev6 years ago (edited)

"""
제 개인적 목표는

  1. Object-Oriented Programming과 친해지기
  2. Github와 친해지기 입니다.

이 목표에 닿기 위해 일단 제가 나름 좀 아는 Python, 그 중에서도 NumpyMatplotlib로부터 시작하려 합니다.
"""

04. Axes Setup: Ticks and Tick Labels

이번에는 Tick이라고 하는, 가로 혹은 세로 축에서 숫자를 표시하는 장소를 가리키는 조그마한 막대기에 대해 다뤄보도록 하겠습니다.

04.1. Tick Location: Basic

틱의 위치를 정하는 것은 크게보면 1. 수동으로 입력한 장소에 표시하기2. 자동으로 정해진 조건에 따라 표시하기로 나눌 수 있습니다.
수동 입력 명령어: Axes.set_xticks(ticks, minor=False) (혹은 Axes.set_yticks())
자동 입력 명령어: Axes.axis.set_major_locator(locator)
자동 입력을 행하는 일종의 조건으로써 Locator instance가 필요합니다.
일단 예제부터 보시겠습니다.

import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator, MultipleLocator

###--- Synthesizing data to be plotted ---###
x = np.arange(5)     # Same as x = np.array(range(5))
y = x**2             # Basically item-wise calculation for numpy arrays

###--- Plotting Start ---###
##-- Page Setup --##
fig = plt.figure()            # Define "figure" instance
fig.set_size_inches(6,4.5)    # Physical page size in inches, (lx,ly)
suptit="Tick Location"
fig.suptitle(suptit,fontsize=15)   # Title for the page

##-- Plotting for axis1 --##
ax1 = fig.add_subplot(1,1,1)   # subplot(# of rows, # of columns, indicater)
ax1.plot(x,y)                                      # plotting line graph

ax1.set_xlim(-1,5)
ax1.set_xticks([0,1,3,4.5])   # Manual Input (List)
ax1.set_xlabel('Manually Typed Tick Location',fontsize=12)

ax1.set_ylim(-1,20)
ax1.yaxis.set_major_locator(MultipleLocator(5))   # For Major Ticks
ax1.yaxis.set_minor_locator(MultipleLocator(1))   # For minor Ticks
ax1.set_ylabel('Using MultipleLocator()',fontsize=12)

ax1.tick_params(axis='both',which='major',labelsize=10)

##-- Seeing or Saving Pic --##
#plt.show()   #- If want to see on screen -#
outdir = "./"
outfnm = outdir+"04_axes_setup.ticks1a.png"     # File format is decided by the file name, eg. png here
#fig.savefig(outfnm,dpi=100,facecolor='0.9',bbox_inches='tight')   # dpi: pixels per inch
fig.savefig(outfnm,dpi=100,facecolor='0.9')   # dpi: pixels per inch

sys.exit()



이 코드를 실행하면 아래와 같은 그림이 나옵니다.
04_axes_setup.ticks1a.png

보시면, 먼저 각 축이 나타낼 범위를 설정하고 ax1.set_xlim(-1,5)
이후 그 범위 안에 Tick을 어떻게 표시할지 설정합니다.
주의하실 점은, 수동 입력의 경우 입력된 Tick의 위치가 설정된 범위 밖에 위치할 경우 자동으로 범위가 늘어납니다.
자동 입력의 경우, 어떤 Locator들이 있는지 알아야 써먹을 수가 있습니다.
Python은 마치 한자처럼 여러가지 기능들을 많이 외우고 있어야 다루기가 쉽습니다.
여러 Locator들의 예는 아래 그림과 링크를 참고하시길 바랍니다.
tick-locators.png
https://matplotlib.org/examples/ticks_and_spines/tick-locators.html

04.2. Tick Location: Y ticks on right

그림을 그리다 보면 필요에 따라 y축의 Ticks를 오른쪽에 그려야 할 경우가 있습니다. (상대적으로 x축 Ticks를 위에 그리는 경우는 매우 적은 것 같습니다.) 그럴 때에는 2줄만 추가하시면 됩니다.

ax1.yaxis.tick_right()
ax1.yaxis.set_ticks_position('both')

만약 첫째 줄만 삽입하고 둘째 줄을 빼면, Y Ticks는 오른편에 나타나지만, 왼편에는 아무 것도 없이 매끈해집니다.

04.3. Tick Labels

보통은 Ticks만 좋은 자리에 표시하면 그 밑의 숫자는 별 문제 없이 표기가 됩니다. 하지만 여러가지 필요에 의해 표기되는 숫자의 표기 형식을 바꾸거나, 아니면 아예 다른 문자로 바꿔야 할 경우가 있습니다.
Tick Label 역시 수동과 자동으로 설정하는 방법이 있습니다.
수동 입력 명령어: Axes.set_xticklabels(labels, fontdict=None, minor=False, **kwargs) (혹은 yticklabels)
자동 입력 명령어: Axes.axis.set_major_formatter(formatter)
역시, 자동 입력을 행하는 일종의 조건으로써 Formatter instance가 필요합니다.
위 예제 그림에서, x 축에는 임의의 문자열을, 그리고 y 축에는 소수점 1자리에 % 표시를 해보겠습니다.
위의 코드에 다음 3줄이 추가되었습니다.

from matplotlib.ticker import FormatStrFormatter

ax1.set_xticklabels(['abcd','efgh','ijkl','mnop'],rotation=90)
ax1.yaxis.set_major_formatter(FormatStrFormatter("%.1f%%"))

그리고 길어진 Tick Label 때문에 축 이름표가 밖으로 밀려나서, savefig()bbox_inches='tight'를 추가하였습니다.
04_axes_setup.ticks2a.png

Formatter 역시 어떤 것들이 있는지 알아야 쓸 수가 있습니다. 아래 그림과 예제 코드가 있는 링크를 확인하세요.
tick-formatters.png
https://matplotlib.org/examples/ticks_and_spines/tick-formatters.html

하지만 저는 사실 Formatter를 잘 안씁니다. 대부분 수동으로 처리하기 때문인데요, 예를 들어 위처럼 y축에 소수점 한자리에 %를 붙인다면,

yt = np.arange(0,21,5)
ytlab = ["{:.1f}%".format(yt1) for yt1 in yt]
ax1.set_yticks(yt)
ax1.set_yticklabels(ytlab)

이렇게 해도 같은 결과가 나옵니다.

04.4. Tick Params

Ticks와 Tick Labels의 겉모습을 설정하는 중요한 명령어로 Axes.tick_params(axis='both', **kwargs)가 있습니다. 저는 이 명령어를 Tick Label의 글자 크기를 조정하는데 주로 이용하지만, 사실 이 명령어 하나로 Tick의 크기와 색깔까지 마음대로 설정할 수 있습니다.
예를 들면 위 예제에서

ax1.tick_params(axis='both',which='major',labelsize=10)

를 다음과 같이 바꿉니다.

ax1.tick_params(axis='x',which='major',length=15,width=5,color='r',labelcolor='b',labelsize=15)
ax1.tick_params(axis='y',which='major',direction='inout',length=15,colors='g',labelsize=7)

바꾼 결과는:
04_axes_setup.ticks2b.png
(이렇게까지 할 필요가 있을까요? ^^)


이걸 정리할수록 느끼는건데, 옵션이 너무 많아서 이걸 어떻게 나중에 OO방식으로 엮어넣을지 솔직히 자신이 없습니다...
또한 아직 Github 계좌도 안텃군요...



List

[Matplotlib] 00. Intro + 01. Page Setup
[Matplotlib] 02. Axes Setup: Subplots
[Matplotlib] 03. Axes Setup: Text, Label, and Annotation
[Matplotlib] 04. Axes Setup: Ticks and Tick Labels

Sort:  

저도 매일 python 만지고 있어서 반가운 글이네요!

그렇군요~
혹시 python을 이용해서 어떤 일 하시는지 여쭤봐도 될까요?
전 사실 프로그래머나 개발자라기 보다는 자료를 분석하여 결론을 도출하는 과정에서 python을 하나의 도구로 이용하고 있습니다.

드림웍스 애니메이션 제작과정에서 필요한 Data 처리의 대부분이 Python으로 개발된 프로그램들에 의해서 처리되고 있어요.

오~
전 지구과학을 연구하고 있는데, 웬지 주제는 완전 달라도 하는 일은 비슷한 점이 있지 않을까 생각되네요.

와, 지구과학 연구라니 완전 멋지세요!

사실 별 거 없습니다...
현실은 연구비 떨어져서 다른 일자리 알아보는 이직 준비생일 뿐이죠.. ^^;;

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.032
BTC 60906.91
ETH 2920.56
USDT 1.00
SBD 3.69