오늘은 2차원 데이터를 표출하는데 있어서 축(axis)을 로그 스케일(log scale)로 처리하는 방법 및 예제를 소개하고자 합니다. 2차원 데이터를 표출하는 대표적인 방법에는 image, contour 등이 있는데, NG 체계에서 관련 그래픽 함수인 IMAGE, CONTOUR 함수를 사용하는 예제로 설명을 해보려고 합니다. 여기서 축을 로그 스케일로 처리한다는 것은 말 그대로 2차원 데이터를 표출할 때 X 또는 Y축을 선형 스케일이 아닌 로그 스케일로 구현한다는 얘기입니다. 먼저 오늘 사용할 2차원 예제 데이터를 다음과 같이 만들어봅시다.
nx = 201
ny = 101
x = FINDGEN(nx)
y = FINDGEN(ny)*0.1
PRINT, MIN(x), MAX(x)
PRINT, MIN(y), MAX(y)
data = HANNING(nx, ny)
여기서는 201x101의 구조를 갖는 data라는 이름의 2차원 배열을 생성하였습니다. 그리고 x와 y라는 배열도 함께 생성하였는데, 이들은 각각 X축 및 Y축 방향의 좌표값들을 담은 1차원 배열이 됩니다. 위의 내용을 실행하여 출력된 x, y의 범위를 보면 x의 경우 0부터 200까지 1.0 간격이고 y는 0부터 10까지 0.1의 간격으로 가정되어 있음을 알 수 있습니다. 이와 같이 data, x, y가 모두 존재하는 경우를 가정하여 예제 데이터를 생성해보았습니다. 그리고 2차원 데이터 자체인 data의 경우 HANNING 함수를 사용하여 생성하였기 때문에, 이 배열 내 원소값들의 범위는 0.0~1.0이 됩니다.
그러면 먼저 IMAGE 함수를 사용하여 이미지 형태로 표출할 경우부터 살펴보겠습니다. 일단 선형 스케일의 일반적인 표출 방법부터 사용해보면 그 과정은 다음과 같습니다.
win1 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
im = IMAGE(data, x, y, AXIS_STYLE=2, $
RGB_TABLE=50, XRANGE=[0, 200], YRANGE=[0, 10], $
MARGIN=[0.1, 0.1, 0.15, 0.1], ASPECT_RATIO=0, /CURRENT)
cb = COLORBAR(TARGET=im, RANGE=[0, 1], /BORDER, ORIENTATION=1, $
POSITION=[0.94, 0.2, 0.98, 0.8])
지금과 같이 표출할 2차원 데이터뿐 아니라 X, Y 좌표 데이터까지 존재하는 경우에는 위와 같이 IMAGE 함수의 인자로 data, x, y를 모두 사용하면 됩니다. 위의 IMAGE 함수 내에서 사용된 속성들 중에서는 특히 ASPECT_RATIO를 주목해야 합니다. 현재 표출중인 2차원 데이터의 X, Y 방향의 좌표값 범위가 각각 0~200, 0~10인데, 가로/세로 비율을 이 값에 의존하게 두면(ASPECT_RATIO의 값이 디폴트인 1인 경우) 가로 방향으로 너무 길쭉한 사각형의 형태로 이미지가 표출될 수 밖에 없습니다. 따라서 ASPECT_RATIO의 값을 일부터 0으로 설정함으로써 가로/세로 비율을 X, Y의 값 범위에 충실하지 않도록 해주어야 합니다. 그리고 data의 값 범위인 0.0~1.0과 색상 사이의 관계를 보여주기 위하여 컬러바를 오른쪽에 배치하였습니다. 그 결과는 다음 그림과 같습니다.
그러면 이번에는 Y축을 로그 스케일로 처리해보겠습니다. 이렇게 할 경우의 결과를 예상해보면, 이미지의 Y축 방향으로 변형이 발생하게 됩니다. 선형 스케일에서 로그 스케일로 변경된다면 당연히 그렇게 되어야 하겠지요. 어쨌든 이러한 작업을 위해서는 IMAGE 함수에서 지원되는 YLOG라는 속성을 사용하면 됩니다. 이 속성의 값을 1로 설정하면 Y축의 스케일을 로그 스케일로 처리하겠다는 의미이긴 합니다. 하지만 이 YLOG 속성만 사용하는 것만으로는 우리가 의도했던 그림이 바로 나오지는 않습니다. 약간 신경써야 할 부분이 더 있는데요. 일단 코드부터 살펴보면 다음과 같습니다.
win1 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
im = IMAGE(data[*, 1:-1], x, ALOG10(y[1:-1]), /YLOG, AXIS_STYLE=2, $
RGB_TABLE=50, XRANGE=[0, 200], YRANGE=[0.1, 10], $
MARGIN=[0.1, 0.1, 0.15, 0.1], ASPECT_RATIO=0, /CURRENT)
cb = COLORBAR(TARGET=im, RANGE=[0, 1], /BORDER, ORIENTATION=1, $
POSITION=[0.94, 0.2, 0.98, 0.8])
앞서 선형 스케일의 일반적 표출 방법과 비교해보면 달라진 부분들이 보입니다. 특히 Y축을 로그 스케일로 처리하기 위하여 YLOG 속성이 사용되었다는 것 뿐만 아니라, IMAGE 함수의 인자들도 앞선 예제코드에서와 다르게 사용되었음을 볼 수 있습니다. 앞선 예제에서는 인자들이 data, x, y의 형태로 단순하게 사용되었던 반면 이번에는 data와 y가 다르게 표현되어 있는데요. 먼저 y에 대하여 ALOG10 함수가 사용되고 있습니다. 즉 Y축의 좌표값들로 구성된 y에 상용로그 함수를 적용하여 값들을 로그값들로 바꾼 것입니다. 따라서 Y축을 로그 스케일로 변형하기 위해서는 YLOG 속성을 사용하면서 Y축의 좌표값 배열에 대해서도 ALOG10 함수를 사용해야 한다는 점을 유의해야 합니다. 그리고 여기서는 y를 그냥 쓰지 않고 y[1:-1]로 사용하였는데, y 배열의 맨 첫번째 값인 0.0을 제외하기 위한 것입니다. 수학적으로 0.0에 대해서는 로그 계산이 불가능하기 때문입니다. 그래서 y 배열의 값들을 다 사용하는 대신, 두번째 값부터 마지막 값까지만 추출하여 사용하겠다는 의미입니다. 그리고 이에 맞춰서 data 배열의 Y축 방향에 대해서도 동일한 인덱싱을 적용하였습니다. 그리고 Y축의 범위를 기존의 0~10으로 하지 않고 0.1~10으로 처리한 부분도 같은 맥락이라고 보면 됩니다. 설명이 좀 장황해지긴 했는데, 로그 스케일로의 처리라는 특성상 분명히 고려해야 할 부분이라는 것을 유념해야 할 것 같습니다. 어쨌든 위 예제코드에 의한 결과는 다음 그림과 같습니다.
이 그림을 보면 Y축이 로그 스케일로 처리되는 것에 맞춰 이미지의 형태로 Y축 방향으로는 변형이 된 것을 알 수 있습니다. 일종의 이미지 비틀기(image warping)의 예라고 볼 수도 있겠습니다. 어쨌든 2차원 데이터의 표출에 있어서 어떤 축을 로그 스케일로 처리하기 위해서는 XLOG 또는 YLOG 속성을 사용하는 것 뿐만 아니라 해당 축의 좌표값들로 구성된 1차원 배열에 대해서도 ALOG10 함수를 사용하여 로그 스케일 처리를 해주는 것이 필수라는 점을 염두에 둬야 합니다. 이러한 특성은 CONTOUR 함수를 사용하여 2차원 데이터를 등위선(contour)의 형태로 표출할 경우에도 마찬가지입니다. 다음은 동일한 예제 데이터를 CONTOUR 함수를 사용하여 먼저 선형 스케일로 표출하는 과정입니다.
win2 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
cn = CONTOUR(data, x, y, RGB_TABLE=50, /FILL, $
XRANGE=[0, 200], YRANGE=[0, 10], $
MARGIN=[0.1, 0.1, 0.15, 0.1], AXIS_STYLE=2, /CURRENT)
cno = CONTOUR(data, x, y, COLOR='black', C_LABEL_SHOW=0, $
/OVERPLOT)
cb = COLORBAR(TARGET=cn, RANGE=[0, 1], /BORDER, ORIENTATION=1, $
POSITION=[0.94, 0.2, 0.98, 0.8])
NG 체계의 CONTOUR 함수의 사용법에 대해서는 제가 기존에 다른 게시물에서 다룬 바 있으므로, 여기서는 결과 위주로만 간략히 소개하겠습니다. 여기서는 CONTOUR 함수가 두번 사용되었는데, 색상이 채워진 형태로 먼저 표출을 한 후 두번째 CONTOUR에서는 각 레벨별 선만 다시 덧그리는 방식을 사용한 것입니다. 그 결과는 다음 그림과 같습니다.
그러면 CONTOUR 함수를 사용하여 로그 스케일로 표출할 경우에는 어떻게 해야 할까요? 다음과 같이 해주면 됩니다.
win2 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
cn = CONTOUR(data, x, ALOG10(y), /YLOG, RGB_TABLE=50, /FILL, $
XRANGE=[0, 200], YRANGE=[0.1, 10], $
MARGIN=[0.1, 0.1, 0.15, 0.1], AXIS_STYLE=2, /CURRENT)
cno = CONTOUR(data, x, ALOG10(y), /YLOG, COLOR='black', $
C_LABEL_SHOW=0, /OVERPLOT)
cb = COLORBAR(TARGET=cn, RANGE=[0, 1], /BORDER, ORIENTATION=1, $
POSITION=[0.94, 0.2, 0.98, 0.8])
앞서 선형 스케일로 표출할 경우와의 비교해보면, CONTOUR 함수의 인자들 중 y만 ALOG10 함수로 처리되었고 /YLOG 속성이 사용되었다는 점이 가장 두드러집니다. 물론 Y축의 범위를 기존의 0~10에서 0.1~10으로 변경했다는 점도 주목해야 합니다. 한가지 또 눈에 띄는 것은 앞서 IMAGE 함수를 사용할 때와 달리 y에 대하여 [1:-1]과 같은 인덱싱을 따로 해주지 않았다는 점인데요. 제가 테스트해본 바로는 CONTOUR 함수에서는 이 부분까지는 신경을 안써줘도 되는 것 같습니다. 어쨌든 그 결과는 다음 그림과 같습니다.
그러면 하는 김에 surface 형태의 표출에서는 어떨지도 한번 살펴보겠습니다. SURFACE 함수를 이용한 표출에서 Y축만 로그 스케일로 처리하는 예제코드는 다음과 같습니다.
win3 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
sf = SURFACE(data, x, y, YRANGE=[0.1, 10], ZRANGE=[0, 1], /YLOG, $
TEXTURE_IMAGE=data, RGB_TABLE=50, MARGIN=0.2, /CURRENT)
cb = COLORBAR(TARGET=sf, RANGE=[0, 1], /BORDER, ORIENTATION=0, $
POSITION=[0.2, 0.90, 0.8, 0.95])
앞서 IMAGE, CONTOUR의 경우와는 또 약간 다른데, YLOG 속성을 사용하고 Y축의 범위를 0.1~10으로 설정하는 것만 신경쓰면 됩니다. 그리고 y 배열에 대하여 ALOG10 함수를 적용하는 것은 필요가 없다는 점도 차이가 있습니다. 그리고 여기서는 서피스 면위에 이미지까지 입히기 위하여 TEXTURE_IMAGE 속성을 사용했습니다. 그 결과는 다음 그림과 같습니다.
오늘은 이와 같이 IMAGE, CONTOUR, SURFACE 등 모든 경우에 대하여 축을 로그 스케일로 처리하는 방법을 살펴보았습니다. 앞서 이미 언급했던 내용이지만, 2차원 데이터의 표출에 있어서 어떤 축을 로그 스케일로 처리하기 위해서는 XLOG 또는 YLOG 속성을 사용하는 것 뿐만 아니라 해당 축의 좌표값들로 구성된 1차원 배열에 대해서도 ALOG10 함수를 사용하여 로그 스케일 처리를 해주면 된다고 정리할 수 있겠습니다(SURFACE 함수는 다름).
'IDL > New Graphics' 카테고리의 다른 글
| NG 체계에서도 POLAR_CONTOUR를? (0) | 2018.09.03 |
|---|---|
| SCATTERPLOT 함수를 이용하여 격자점 표시하기 (0) | 2018.05.18 |
| Windows 10용 IDL에서 NG 체계 그림 저장 문제 및 해결 방법 (0) | 2018.02.12 |
| VECTOR 함수를 이용하여 벡터 필드 표출하기 [2] (0) | 2017.12.07 |
| VECTOR 함수를 이용하여 벡터 필드 표출하기 [1] (6) | 2017.11.30 |