오늘은 NG 체계의 그래픽 함수들 상당수에 공통적으로 지원되는 ASPECT_RATIO라는 속성에 대하여 알아보고자 합니다. 사실 이개념은 NG뿐 아니라 DG 체계에서도 존재하는데, 일단 NG 체계 기준으로 먼저 언급을 한 후 DG에서의 방식에 대한 언급도 해보기로 하겠습니다. 속성 자체에 대한 개념 설명 대신 예제를 먼저 보면서 이해해나가기로 합시다. 이를 위하여 다음과 같은 평범한 플롯을 그려보겠습니다. 플롯에 사용된 예제 데이터는 0~99까지의 실수에 대한 제곱근 값들이긴 한데, 궁극적으로는 X, Y 축의 범위가 더 중요하긴 합니다. 일단 다음과 같은 예제 코드를 사용해서 이 데이터를 PLOT 함수로 표출하되, X축의 범위는 0~50, Y축의 범위는 0~10으로 설정하였습니다. 그리고 이 그림을 표출하기 위한 그래픽창의 크기는 픽셀 단위로 600X400으로 설정하였습니다. 이 예제 코드를 실행하면 그 결과는 다음 그림과 같이 나타납니다.
win = WINDOW(DIMENSIONS=[600, 400], /NO_TOOLBAR)
pl = PLOT(SQRT(FINDGEN(100)), XRANGE=[0, 50], YRANGE=[0, 10], $
COLOR='magenta', THICK=2, /CURRENT)
표출된 그림이 이렇게 보일 것이라는 사실은 충분히 예측이 가능합니다. 내가 원하는 크기의 그래픽창을 띄우고 그 안에 원하는 플롯을 표출하는 작업이고, IDL에서는 그래픽창의 크기에 맞도록 적당히 여백을 둬서 플롯을 구현합니다. 그런데, 여기서 또 다른 시도를 해보고자 합니다. 위의 예제 코드에서 PLOT 함수의 내용에 ASPECT_RATIO라는 속성을 다음과 같이 추가해 봅시다. 그리고 그 값은 1로 설정합니다. 이렇게 해서 그림을 표출하면 그 모습은 다음과 같습니다.
pl = PLOT(SQRT(FINDGEN(100)), XRANGE=[0, 50], YRANGE=[0, 10], $
COLOR='magenta', THICK=2, /CURRENT, ASPECT_RATIO=1)
갑작스레 등장한 ASPECT_RATIO=1이라는 문구로 인하여 뭔가 일이 벌어진 것 같습니다. 즉, 플롯 자체의 가로/세로 비율이 이전과는 달라진 것을 확인할 수 있습니다. 이쯤 되면 ASPECT_RATIO의 역할이 무엇인지 짐작이 가능할 것 같은데요. 이 속성을 활성화하면 플롯상에서 X/Y 축의 상대적 스케일을 우선적으로 고려하게 됩니다. 지금 이 플롯에서는 X축의 범위의 크기가 50이고 Y축의 범위의 크기는 10입니다. 즉, 가로/세로 비율이 5:1인 상태이며, 이러한 상대적 비율에 충실하게 플롯이 표출된 모습이 바로 위의 그림에서 나타난 것입니다. 이렇게 가로/세로 비율을 축의 범위에 충실하게 맞춰주는데 있어서는, 그래픽 창의 가로/세로 비율 따위는 안중에도 없습니다. 일단 ASPECT_RATIO 속성이 활성화된 상태에서는 그래픽 창의 가로/세로 비율을 완전히 무시하고 오직 X축과 Y축의 상대적 비율에만 신경을 쓰게 됩니다.
물론 기본 설정상으로는 ASPECT_RATIO는 비활성 상태입니다. 사실상 ASPECT_RATIO=0이 디폴트 상태라고 보면 됩니다. 예제 코드에서 사용된 PLOT 함수외에도 CONTOUR, SCATTERPLOT, BOXPLOT 등 2차원 XY 공간 기반의 표출 기능들 모두 이 속성이 지원되지만, 디폴트 설정상으로는 오직 그래픽 창의 가로/세로 비율에 충실하도록 작동합니다. ASPECT_RATIO=1을 명시적으로 사용해야만, 가로/세로 비율을 데이터의 스케일에 맞추도록 설정하는 것이 가능합니다. 한가지 유념해 둘 것은, 이 속성이 가질 수 있는 유효한 값은 음수가 아닌 모든 정수가 가능하다는 것입니다. 단, 이 값을 0으로 설정하는 것은 이 속성을 사용하지 않는 것과 같습니다. 그리고 ASPECT_RATIO=1인 경우에는 X/Y축의 범위를 1:1로 해석하게 되고, ASPECT_RATIO=2인 경우에는 1:2로, 3인 경우에는 1:3으로 해석하는 방식입니다. 이 내용은 위의 예제 코드에서 ASPECT_RATIO 속성의 값을 다양하게 바꿔보면 쉽게 확인이 가능하다는 점 참조하시기 바랍니다.
그런데 이와 같이 ASPECT_RATIO가 기본적으로 0이라는 점에 있어서 단 하나의 예외가 있습니다. 바로 2차원 배열을 이미지로 표출하는 역할을 하는 IMAGE 함수입니다. 설명을 위하여, 가로/세로 크기가 같은 2차원 데이터를 가상으로 만들고 이를 IMAGE 함수로 표출해 봅시다. 단 그래픽 창의 크기는 아까와 마찬가지로 600X400으로 해봅시다. 이를 위하여 다음과 같은 예제 코드를 만들어 실행해보면, 그 결과는 다음 그림과 같습니다.
data = HANNING(500, 500)
win2 = WINDOW(DIMENSIONS=[600, 400], /NO_TOOLBAR)
im = IMAGE(data, RGB_TABLE=69, MARGIN=0, /CURRENT)
여기서는 MARGIN 속성의 값을 0으로 설정함으로써 그래픽 창의 가로 및 세로 방향으로 여백을 주지 않도록 했습니다. 하지만 실제로 표출된 결과를 보면 가로 방향의 여백은 여전히 남아있는 상태입니다. 그 이유는, 이미지에 한해서는 데이터 자체의 픽셀 단위의 가로/세로 비율을 우선적으로 고려하도록 설정되어 있기 때문입니다. 즉, 위의 예제에서 PLOT 함수에 ASPECT_RATIO=1 속성을 사용한 것과 마찬가지인 셈인데, IMAGE 함수의 경우는 이것이 디폴트입니다. 따라서 반대로 생각한다면, IMAGE 함수가 오직 그래픽 창 자체의 가로/세로 비율을 우선적으로 고려하게 하려면 ASPECT_RATIO=0이라는 속성을 명시적으로 사용해야 한다는 것을 알 수 있습니다. 즉, 다음과 같이 해줘야만 이미지가 그래픽 창의 가로/세로 비율에 맞춰지게 됩니다. 이 경우는 원본 데이터의 가로/세로 스케일은 완전히 무시된 상태가 됩니다.
im = IMAGE(data, RGB_TABLE=69, MARGIN=0, /CURRENT, ASPECT_RATIO=0)
따라서 NG 체계에서 그래픽 표출 작업을 하는데 있어서 그림의 가로/세로 비율이 나의 의도와 뭔가 맞지 않는 것 같다는 생각이 든다면 이 ASPECT_RATIO 속성을 직접 설정해보면 됩니다. 참고로 NG가 아닌 DG 체계에서는 PLOT 프로시저에서 이와 유사한 역할을 하는 키워드가 있는데, 바로 ISOTROPIC이라는 키워드입니다. 아마 DG 체계에서 그래픽 프로시저들을 나름 많이 써보신 분들도 이 키워드가 다소 낯설 수 있습니다. 왜냐하면 이 키워드가 사용이 안되는 것(ISOTROPIC=0)이 일반적인 디폴트 설정이고, 이 상태에서는 항상 우리가 보아왔듯이 그래픽 창의 가로/세로 비율에 적절하게 맞춰서 그림을 보여주기 때문입니다. 따라서 이 키워드를 명시적으로 사용할 경우, 즉 ISOTROPIC=1 또는 /ISOTROPIC을 사용할 경우에는 가로/세로 비율을 데이터의 XY축 범위에 맞춰준다는 것을 이제는 짐작하는 것이 어렵지 않을 것입니다. 즉, 이름만 다를 뿐 사실상 ASPECT_RATIO의 역할과 똑같다고 보면 됩니다.
다음은 위의 예제와 동일한 데이터를 갖고 DG 체계의 PLOT 프로시저를 사용하여 표출해본 예제입니다. 먼저 디폴트 설정에 따라 플롯을 그리는 예제 코드 및 그 실행 결과는 다음과 같습니다.
DEVICE, DECOMPOSED=0
WINDOW, XSIZE=600, YSIZE=400
PLOT, SQRT(FINDGEN(100)), XRANGE=[0, 50], YRANGE=[0, 10], $
BACKGROUND=255, COLOR=0
그리고 다음과 같이 ISOTROPIC 키워드를 사용하여 표출해보면 그 결과는 다음 그림과 같습니다.
PLOT, SQRT(FINDGEN(100)), XRANGE=[0, 50], YRANGE=[0, 10], $
BACKGROUND=255, COLOR=0, /ISOTROPIC
이와 같이 /ISOTROPIC을 사용할 경우에는 가로/세로 비율을 데이터의 XY축 범위에 맞춰줍니다. 즉 여기서는 데이터 범위 기준으로 가로/세로 비율이 50/10이므로 그 비율에 충실하게 플롯이 표출된 것을 확인할 수 있습니다.
* 처음 작성했던 내용 중에서 ASPECT_RATIO의 유효한 값이 0 아니면 1 뿐이라는 내용이 있었는데 잘못된 정보이므로 위의 해당 내용을 수정하였습니다.
'IDL > New Graphics' 카테고리의 다른 글
IDL 8.6 NG 체계의 폰트 관련 변경 사항 (0) | 2017.02.02 |
---|---|
ELLIPSE 함수의 사용에 있어 주의할 점 (0) | 2016.04.28 |
PLOT3D에서 구체(Sphere) 심볼 사용법 (0) | 2016.02.29 |
NG체계에서 다중 플롯 그리기 (Multi-Plot in NG) [2] - 업데이트! (0) | 2016.02.22 |
NG체계에서 다중 플롯 그리기 (Multi-Plot in NG) [1] (0) | 2016.02.17 |