IDL/New Graphics

축의 눈금(Tick)에 대한 조정(커스터마이즈) 방법

이상우_idl 2020. 10. 21. 14:49
728x90
반응형

NG 체계에서 표출되는 그림들 중 대부분은 축(Axis)을 동반합니다. 대표적인 예로 들 수 있는 각종 플롯(Plot)들 뿐만 아니라 Contour, Image, Surface 등과 같은 그래픽 표출에서는 축(Axis)이 항상 등장합니다. 대개의 경우 X, Y축은 항상 나오고 3차원 그래픽일 경우에는 Z축까지도 필요합니다. 그리고 이러한 축(Axis)마다 눈금(Tick)들이 매겨져있습니다. 이러한 눈금들은 마디마디 눈금값들의 형태로 표시가 되는데, 전체 그림이 표출되면서 이러한 눈금들도 어느 정도까지는 자동적으로 나름대로 잘 알아서 표시가 됩니다. 이러한 간단한 예제를 코드와 함께 구현해보면 그 내용은 다음과 같습니다.

 

x = FINDGEN(200)

y = SIN(2.0*x*!pi/25.0)*EXP(-0.02*x)

win = WINDOW(DIMENSION=[600, 500], /NO_TOOLBAR)

pl = PLOT(x, y, COLOR='crimson', THICK=2, /CURRENT)

 

이 내용을 실행하면 다음과 같은 그림이 표출됩니다.

 

 

그냥 우리가 항상 보는 것과 같은 평범한 플롯 그림입니다. 그런데 사실 오늘 주목하고자 하는 부분은 바로 축(Axis)과 눈금(Tick)인데요. 이 그림에서 X축의 눈금들을 보면 그 범위는 0~200이고 메이저 눈금(큰 눈금) 사이의 간격은 50으로 되어 있습니다. Y축의 경우는 범위는 -1~+1이고 메이저 눈금 사이의 간격은 0.5입니다. 이와 같이 각 축마다 눈금들이 적절한 범위와 간격으로 설정되는데, 이러한 설정은 IDL이 자동적으로 알아서 해줍니다. 즉 유저가 이런 부분들을 굳이 세세하게 신경쓰지 않아도, 데이터 자체의 범위를 바탕으로 IDL이 잘 판단하여 표시해줍니다. 뭐 너무나 당연한 얘기입니다. 그런데 축의 눈금에 대한 설정을 그냥 IDL이 디폴트로 처리하도록 맡겨두는 대신 유저가 직접 설정하여 커스터마이즈를 해야 하는 경우도 간혹 있습니다. 이와 같이 축의 눈금들에 대한 세부 설정을 유저가 직접 하는 것도 당연히 가능합니다. 이러한 기능을 담당하는 여러가지 관련 속성들이 PLOT, CONTOUR, SURFACE 등의 그래픽 함수들에서 지원되고 있습니다. 오늘은 이러한 속성들을 이용하여 축의 눈금에 대한 세부 설정을 유저가 직접 처리하여 나름대로 커스터마이즈하는 방법을 소개하고자 합니다.

 

먼저 축의 눈금 간격을 조정하는 방법부터 살펴보면, [XYZ]TICKINTERVAL 속성을 사용하면 됩니다. 앞서 표출했던 그림을 다시 살펴보면 X축의 눈금 간격이 50으로 처리되어 있는데요. 이 간격을 20으로 바꿔봅시다. 이를 위해서는 PLOT 함수가 사용된 내용을 다음과 같이 바꿔주면 됩니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKINTERVAL=20, /CURRENT)

 

이와 같이 XTICKINTERVAL 속성을 이용하면 됩니다. 그러면 결과는 다음 그림과 같습니다.

 

 

이와 같이 X축의 눈금 간격이 20으로 변경됩니다. 이와 같이 [XYZ]INTERVAL 속성은 말 그대로 눈금 사이의 간격을 조절하는 역할을 하는데요. 이와 유사한 기능을 담당하는 또 다른 속성이 있는데 바로 [XYZ]MAJOR 속성입니다. 여기서 Major의 의미는 '큰 눈금' 정도로 보면 됩니다. 그래서 메이저 눈금(큰 눈금)의 갯수를 조절하는 역할을 합니다. 위의 PLOT 함수가 사용되었던 내용을 다음과 같이 바꿔봅시다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XMAJOR=11, /CURRENT)

 

여기서는 XMAJOR 속성을 이용하여 X축의 메이저 눈금의 갯수를 11로 설정하였는데, 결과는 다음 그림과 같습니다.

 

 

X축의 범위가 0~200이고 그 사이를 나누는 메이저 눈금의 갯수가 11개이므로 실제 이 11개의 메이저 눈금들의 위치는 0, 20, 40, ...., 180, 200이 됩니다. 여기서 유의할 점은 0~200 범위를 20으로 나누면 10개일 것처럼 보일 수도 있지만, 시작과 끝 눈금이 모두 포함되어야 하므로 10개가 아닌 11개가 되어야 한다는 것입니다. 따라서 이 그림은 사실은 앞서 XTICKINTERVAL 속성의 값을 20으로 설정하여 얻었던 그림과 완전히 동일합니다. 결국 [XYZ]TICKINTERVAL 속성은 눈금들의 "간격"에 촛점을 둔 것이고 [XYZ]MAJOR 속성은 눈금들의 "갯수"에 촛점을 둔 것이라는 차이만 있다고 보면 됩니다. 만약에 XMAJOR 속성의 값을 11 대신 10으로 설정할 경우에는 다음과 같은 결과를 얻게 되므로 유의해야 합니다.

 

 

어쨌든 메이저 눈금들의 갯수를 조절하는 것도 사실상 간격을 조절하는 것과 비슷한 작업이라고 볼 수 있습니다. 이제 이번에는 눈금들의 위치나 간격이 좀 더 불규칙하게 표시되도록 하는 방법을 보겠습니다. 이를 위해서는 [XYZ]TICKVALUES 속성을 사용하면 되는데요. 위의 PLOT 함수가 사용된 내용을 다음과 같이 바꿔봅시다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKVALUES=[10, 40, 90, 150], /CURRENT)

 

여기서는 XTICKVALUES 속성을 사용하여 메이저 눈금이 10, 40, 90, 150의 위치에만 표시되도록 한 것입니다. 실제 결과는 다음 그림과 같습니다.

 

 

이와 같이 [XYZ]TICKVALUES 속성을 이용하면 원하는 값들에 대해서만 눈금이 표시되도록 할 수 있습니다. 이 속성에 대해서는 위와 같이 원하는 눈금값들로 구성된 배열을 지정하면 되는데요. 이 배열 내의 값들의 순서는 어떻게 되든 상관 없습니다. 즉 다음과 같이 배열 내 숫자들의 값 순서가 뒤죽박죽이어도 결과는 똑같이 산출된다는 점 유의하시기 바랍니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKVALUES=[150, 40, 90, 10], /CURRENT)

 

그리고 이번에는 눈금값으로 표시된 숫자 자체를 아예 바꿔보려고 합니다. 사실 바로 위 그림에서 눈금값으로 표시된 10, 40, 90, 150과 같은 것들은 모습은 숫자이지만 실제로는 문자(String)입니다. 그리고 이렇게 눈금값으로 표시된 '문자'들은 [XYZ]TICKNAME이란 속성을 사용하여 다른 '문자'들로 대체하는 것이 가능합니다. 위의 예제를 약간 응용하면서 XTICKNAME 속성을 추가적으로 사용해본 예제는 다음과 같습니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKVALUES=[10, 40, 90, 150], $

  XTICKNAME=['A', 'B', 'C', 'D'], $

  FONT_SIZE=11, /CURRENT)

 

여기서는 XTICKNAME 속성을 사용하면서 이 속성에 대하여 A, B, C, D 네 개의 문자들로 구성된 배열을 지정하였습니다. 그리고 폰트 크기도 약간 더 키웠습니다. 그 결과는 다음 그림과 같습니다.

 

 

이와 같이 X축의 네 개의 눈금값들이 기존의 10, 40, 90, 150에서 이제는 A, B, C, D로 대체된 것을 볼 수 있습니다. 결국 눈금의 갯수와 동일한 갯수의 문자값들로 구성된 배열을 지정하면 내가 원하는 어떤 문자로든 변경이 가능하다는 얘기입니다. 만약에 네 개의 눈금값들을 2700, 60, 983, 6378과 같이 뜬금없는 숫자들로 바꿔버리고자 한다면 어떻게 해야 할까요? 물론 이 네 개의 숫자들을 문자형으로 명시해주는 것이 반드시 필요합니다. 그 내용은 다음과 같습니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKVALUES=[10, 40, 90, 150], $

  XTICKNAME=['2700', '60', '983', '6378'], $

  FONT_SIZE=11, /CURRENT)

 

그리고 그 결과는 다음 그림과 같습니다.

 

 

눈금에 표시된 숫자들 자체가 좀 뜬금없긴 하지만 어쨌든 이와 같이 축의 눈금값들(엄밀히 말하면 메이저 눈금마다 매겨지는 문자값들)을 내 마음대로 조정하는 것도 가능하다는 것입니다. 그리고 위의 예제 코드의 내용은 다음과 같이 적어서 사용해도 됩니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKVALUES=[10, 40, 90, 150], $

  XTICKNAME=STRTRIM(STRING([2700, 60, 983, 6378]), 2), $

  FONT_SIZE=11, /CURRENT)

 

이전의 예제 코드에서는 모습은 숫자이지만 실제로는 문자인 값들로 구성된 배열 ['2700', '60', '983', '6378']을 처음부터 만들어서 사용했지만, 이번에는 실제 숫자로 구성된 배열 [2700, 60, 983, 6378]에 대하여 문자형 변환 및 공백 제거 처리를 가하여 문자형 배열로 변환하여 사용한 것입니다. 즉 과정은 약간 다르지만 결과적으로는 ['2700', '60', '983', '6378']와 같은 배열이 XTICKNAME 속성에 지정되도록 했다는 점은 같습니다. 물론 결과 그림도 당연히 똑같습니다.

 

그리고 아래의 내용은 XTICKNAME 속성을 이용하는 또 다른 예제인데, 여기서는 XTICKINTERVAL 속성도 함께 등장합니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKINTERVAL=50, XTICKNAME=['A', 'B', 'C', 'D', 'E'], /CURRENT)

 

이 결과는 다음 그림과 같습니다. 이런 경우에는 메이저 눈금들의 갯수와 눈금 문자값들의 갯수를 서로 맞춰줘야 한다는 점을 유의해야 합니다.

 

 

그리고 마지막으로 하나만 더 살펴본다면, [XYZ]MINOR 속성을 이용하여 마이너 눈금들의 갯수를 조정하는 것도 가능합니다. 마이너 눈금이라는 것은 메이저 눈금들 사이에 있는 작은 눈금들인데요. 바로 위의 그림을 보면 X축의 마이너 눈금들의 갯수는 4개입니다. 물론 마이너 눈금들의 갯수도 별다른 설정을 따로 하지 않으면 IDL이 알아서 처리를 합니다. 즉 여기서는 X축에 대해서는 그냥 알아서 4개로 처리된 상태인데요. 만약 여기서 X축의 마이너 눈금들의 갯수를 4개가 아닌 2개로 내가 직접 설정하고자 한다면 다음과 같이 XMINOR 속성을 사용하면 됩니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKINTERVAL=50, XTICKNAME=['A', 'B', 'C', 'D', 'E'], $

  XMINOR=2, /CURRENT)

 

그 결과는 다음 그림과 같습니다.

 

 

만약 마이너 눈금들을 아예 없애고 오직 메이저 눈금들만 보이도록 하고 싶다면, 다음과 같이 값을 아예 0으로 설정하면 됩니다.

 

pl = PLOT(x, y, COLOR='crimson', THICK=2, $

  XTICKINTERVAL=50, XTICKNAME=['A', 'B', 'C', 'D', 'E'], $

  XMINOR=0, /CURRENT)

 

그 결과는 다음 그림과 같습니다. 경우에 따라서는 이와 같이 마이너 눈금들이 아예 안보이도록 하는 것이 더 나은 경우도 있기 때문에 이러한 팁도 잘 알아두시면 좋습니다.

 

 

오늘 소개한 [XYZ]TICKINTERVAL, [XYZ]TICKVALUES, [XYZ]TICKNAME, [XYZ]MAJOR, [XYZ]MINOR 등과 같은 속성들은 X축, Y축, Z축 어디서든 사용이 가능합니다. 그리고 축(Axis)을 동반하는 그림을 표출하는 기능을 수행하는 그래픽 함수라면 반드시 이 속성을 지원한다고 보면 되기 때문에, 개별 그래픽 함수에 대하여 IDL 도움말에서 실제로 이러한 속성들이 지원되는지 확인 후 사용하시면 됩니다.

반응형