IDL/New Graphics

NG 체계에서 축(Axis)의 세부 조정 예제

이상우_idl 2017. 4. 29. 10:00
728x90
반응형

NG 체계에서 PLOT, CONTOUR 등의 기능을 사용하여 그림을 그릴 때 반드시 등장하는 요소가 바로 축(Axis)입니다. 2차원적인 가시화의 경우라면 X, Y축이 존재할 것이고, 3차원적인 가시화의 경우라면 Z축도 추가됩니다. 오늘은 2차원 플롯에서 축의 특성을 세부적으로조정하는 예제를 보고자 합니다. 오늘은 먼저 목표 그림을 먼저 제시하고, 이러한 그림을 그리기 위하여 필요한 기법들을 살펴 보기로 하겠습니다. 목표 그림은 다음과 같습니다.



이 그림은 Sine 곡선을 그려본 예제인데, 사실 얼핏 보면 그리 특별해 보이지 않을 수 있습니다. 하지만 PLOT 기능을 사용하여 표출한 그림은 기본적으로는 다음과 같이 XY축이 박스 형태를 갖는 모습을 보이게 됩니다. 하지만 위의 그림은 그렇지가 않죠. 따라서 위와 같은 형태로 표출을 하려면 어떤 과정들이 추가적으로 필요한지를 확인해보고자 합니다. 설명을 위하여 순서상 먼저 아래와 같은 그림을 표출하는 과정부터 먼저 시작합니다. 아래 그림을 표출하는데 사용된 예제 코드는 바로 아래에 있습니다.



x = FINDGEN(361)

y = SIN(x*!DTOR)

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

pl = PLOT(x, y, COLOR='crimson', THICK=3, XRANGE=[0, 360], $

  XTICKINTERVAL=90, XTITLE='Degree', YTITLE='Value', $

  TITLE='Sine Plot', FONT_SIZE=11, AXIS_STYLE=2, CLIP=0, /CURRENT)


Sine 곡선을 그리기 위한 x, y 데이터를 먼저 만든 다음 WINDOW, PLOT 함수를 적절히 활용하였습니다. PLOT 함수 내에서 사용된 세부적인 속성들에 대해서는 일일이 설명을 하지는 않겠습니다. 다만 여기서 AXIS_STYLE이라는 키워드가 사용되었는데 이 키워드에 먼저 주목을 해야 합니다. 말 그대로 축의 스타일을 설정하는 역할을 하는 키워드인데요. 위 예제 코드에서는 이 값을 2로 설정하였습니다.사실 이 2라는 값이 디폴트 값입니다. 따라서 굳이 이 키워드를 사용하지 않을 경우에는 그냥 2라는 값으로 가정하고 처리합니다. 이 경우에는 우리가 항상 보는 박스 형태의 XY축 공간이 그려집니다. 그 얘기는 이 키워드의 값을 2가 아닌 다른 값으로 설정할 경우에는 다른 형태의 그림이 그려진다는 얘기입니다. 실제로 이 키워드에 줄 수 있는 값은 0, 1, 2, 3, 4 중 하나입니다. 만약 PLOT 함수에서 이 키워드의 값을 다음과 같이 1로 설정할 경우에는 다음과 같은 형태의 그림을 볼 수 있습니다.


pl = PLOT(x, y, COLOR='crimson', THICK=3, XRANGE=[0, 360], $

  XTICKINTERVAL=90, XTITLE='Degree', YTITLE='Value', $

  TITLE='Sine Plot', FONT_SIZE=11, AXIS_STYLE=1, CLIP=0, /CURRENT)



즉 이 경우는 박스 형태가 아니라 X, Y축을 각각 하나씩만 나타내며 각 축 범위의 최소값에 해당되는 부분에 위치하게 됩니다. 맨 처음에제시했던 그림은 바로 이와 같은 형태에서 좀 더 세부 조정을 추가한 결과입니다. 우리가 원하는 결과를 얻으려면 좀 더 작업을 해야 하는데, 가장 핵심적인 부분은 X축을 끌어올려서 Y=0 좌표에 위치시켜야 한다는 것입니다. 사실 PLOT 함수를 사용하여 2차원 플롯을 그릴 때 XY축에 대한 세부 조정을 담당하는 속성들이 여럿 있습니다. IDL 도움말에서 PLOT 함수에 관한 내용을 보면 다음 그림과 같은 표를 볼 수 있는데, 여기 나와있는 속성들이 주로 그러한 역할을 담당합니다.



하지만 지금 우리가 하고자 하는 것은 축에 대한 세부 특성을 조정하는 것이 아니라 아예 축 자체를 옮기는 작업인데, 이를 위해서는 좀 다른 방법을 사용해야 합니다. 그 방법은 다음과 같은 한 줄의 내용을 추가적으로 실행하는 것입니다.


pl.AXES[0].Location = [0, 0]


즉, 먼저 PLOT 함수를 사용할 때 AXIS_STYLE의 속성을 1로 설정하여 그림을 그린 직후에 바로 위와 같은 명령을 추가로 실행하면 된다는 얘기입니다. 사실 이 내용이 한 줄이라 간단해 보이긴 하지만, 그 내용에 관한 이해 및 설명은 아주 간단하지는 않습니다. 그래도 그렇다고 아주 난감한 내용도 아니므로 설명을 좀 해보겠습니다. 여기서 pl은 PLOT 함수가 사용된 결과에 해당되는 변수입니다. 일단 표출된 플롯 그림의 세부 속성들을 이 변수를 통해서 접근할 수 있는데, AXES는 이 플롯에서 갖고 있는 축들에 해당됩니다. 현재는 총 2개의 축들(X축 하나및 Y축 하나)이 존재하는 상태입니다. 따라서 AXES[0]은 그 중 첫번째인 X축에 해당됩니다. 그리고 AXES[1]이 Y축에 해당됩니다. 그리고 Location은 축의 속성들 중 하나로서 축의 시작점 좌표에 해당됩니다.


따라서 위의 한 줄의 명령의 내용을 번역한다면,"현재 구현되어 있는 플롯 개체인 pl의 축들 중 첫번째 항목인 X축이 시작되는 위치의 좌표를 [0, 0]으로 설정하라"는 뜻이 됩니다. 이렇게 하면 X축이 시작되는 지점의 Y축 좌표가 0이 되므로 다음 그림과 같은 결과를 얻게 됩니다.



그런데 이 그림을 자세히 보면 우리가 원하던 결과에 근접하긴 하지만 아직은 뭔가 부족한 부분이 있습니다. 가장 거슬리는 부분이라면, X축의 눈금값들 중 0이 Y축 선과 겹쳐 보인다는 것입니다. X축의 눈금값들을 표시하는 것은 필요하겠지만 이 0만 살짝 제거하는 방법은 없을까요? 물론 있습니다. 다음과 같은 내용을 추가로 실행하면 됩니다. 이 세 줄의 내용이 작업한 내역은 다음과 같습니다.


xtn = pl.XTICKNAME

xtn[0] = ''

pl.XTICKNAME = xtn


1) 현재 구현되어 있는 플롯 개체인 pl의 X축 눈금에 해당되는 문자값들을 xtn이라는 배열로 가져온다.

2) 배열 xtn의 첫번째 문자값이 원래 '0'이었을텐데, 이를 ''로 대체한다. (''는 null string에 해당)

3) 이렇게 내용이 변경된 배열 xtn을 플롯 pl의 X축 눈금 문자값들로 재설정한다.


이와 같이 NG 체계에서는 일단 구현되어 있는 그래픽 개체에 대해서 원하는 속성들을 가져오거나 후속으로 변경하는 것이 가능하기 때문에, 이러한 장점을 충분히 활용한 예제라고 보면 됩니다. 이렇게 하면 그 결과는 다음 그림과 같습니다.



이러한 방식을 잘 이해하고 응용하면, 프로그래머가 원하는 만큼의 다양한 후속 설정들이 얼마든지 가능합니다. 만약 X축의 타이틀 문자인 "Degree"가 Sine 곡선과 겹치는 것이 좀 거슬린다면, 다음과 같이 원래의 타이틀 문자를 없애고 별도의 캡션 문자를 원하는 위치에 새로 만들어 표시하는 것도 가능합니다. 그 결과는 다음 그림과 같습니다.


pl.XTITLE = ''

tx = TEXT(360, 0.15, 'Degree', ALIGNMENT=1, FONT_SIZE=11, /DATA)



이 정도면 제가 맨 처음에 제시했던 '오늘의 목표 그림'을 그리는 목표는 일단 달성한 셈입니다. 이왕 이렇게 된 거 하나만 더 해보면, 이번에는 Y축에 대하여 눈금값 및 타이틀 문자들의 색상 및 폰트를 다음과 같이 변경해 봅시다. 그 결과는 다음 그림과 같습니다.


pl.YTICKFONT_STYLE = 'bold'

pl.YTEXT_COLOR = 'dodger blue'



플롯 계열의 그림 표출에 있어서 축(Axis)과 관련된 속성들을 이와 같은 방식으로 조정하면, 이와 같이 좀 더 다양한 방식의 표출이 가능합니다. 물론 이와 같은 설정이 가능한 속성들은 매우 다양하게 제공되므로 IDL 도움말에서 PLOT 또는 유사 그래픽 함수에 대한 내용을찾아보는 것이 좋습니다.

반응형

'IDL > New Graphics' 카테고리의 다른 글

눈금값의 포맷(Tick Format)을 변경하는 방법  (0) 2017.07.11
PDF, EPS, PS 저장에 관하여 (NG 체계)  (0) 2017.05.13
IMAGE and CONTOUR in NG [1]  (0) 2017.04.07
SURFACE 함수 소개 [2]  (0) 2017.03.31
SURFACE 함수 소개 [1]  (0) 2017.03.27