우리가 플롯 계열의 표출을 할 때 각 데이터 포인트를 심볼(Symbol)의 형태로 표시할 경우가 굉장히 많습니다. 제가 이 블로그에서도 그러한 예제를 여러 차례 소개해드린 바 있습니다. 예를 들면 다음 그림도 그러한 예제입니다.
이 그림에서는 다이아몬드 형태의 심볼이 사용되고 있는데, 물론 IDL에서는 그 외에도 여러가지 형태의 심볼들을 사용할 수 있습니다. 이러한 기능은 사실 DG 및 NG 체계에서 모두 제공됩니다. 플롯 기능의 예를 들면, DG 체계에서는 PLOT 명령의 PSYM 키워드를 통하여 설정할 수 있고, NG 체계에서는 PLOT 함수의 SYMBOL 속성을 통하여 설정할 수 있습니다. 다만 이러한 방식으로 사용할 수 있는 심볼들의 종류는 나름 충분해보일 수도 있지만 그 갯수는 분명히 제한적입니다. 만약 기본적으로 제공되지 않는 독자적인 형태의 심볼을 사용하고자 한다면 사용자가 직접 제작하는 수밖에 없습니다. 그래서 오늘은 사용자가 직접 커스텀 심볼을 제작하여 사용하는 방법을 소개해보고자 합니다. 먼저 심볼을 정의하는 방법부터 살펴본 다음 DG 체계 및 NG 체계에서의 적용 방법을 이어서 살펴보겠습니다.
< 심볼의 정의 방법 >
심볼의 형태는 다음과 같이 원점의 좌표가 (0, 0)이고 X 및 Y 축의 범위가 대략 -1에서 +1인 2차원 공간상에서 정의되도록 하는 것이 가장 좋습니다.
이것은 심볼의 형태를 처음에 정의한 상태에서 나중에 크기의 조절 또는 회전을 하게 되는 경우까지도 고려해야 하기 때문입니다. 일단 심플하게 정사각형의 형태로 정의를 해봅시다. 그 과정은 다음과 같습니다.
sx = [-1, -1, 1, 1, -1]
sy = [-1, 1, 1, -1, -1]
이와 같이 정사각형을 구성하는 꼭지점들의 X 및 Y 좌표 값들을 순서대로 담은 sx 및 sy라는 배열들을 정의한 것입니다. 이 좌표값들로 정의되는 직사각형의 형태는 실제로 다음 그림과 같습니다.
즉 이와 같은 방식으로 정사각형의 형태를 갖는 심볼을 정의하여 사용하게 됩니다. 물론 이와 같은 방식을 사용하면 더 복잡한 형태의 심볼들도 얼마든지 정의할 수 있겠지만, 여기서는 일단 정사각형의 심볼을 정의하여 사용해보기로 합시다.
< DG 체계의 플롯에서 적용 >
이와 같이 사용자가 직접 정의한 심볼을 DG 체계의 그래픽에서 적용하려면 USERSYM 명령을 사용해야 합니다. 그 방법은 다음과 같이 간단합니다.
USERSYM, sx, sy
이 상태에서 가상의 X, Y 데이터를 사용하여 예제 그림을 하나 그려봅시다. 그 과정은 다음과 같습니다.
x = FINDGEN(19)+1
y = SQRT(x)
DEVICE, DECOMPOSED=1
WINDOW, XSIZE=600, YSIZE=500, RETAIN=2
PLOT, x, y, /NODATA, CHARSIZE=1.2, $
BACKGROUND='ffffff'x, COLOR='000000'x
OPLOT, x, y, PSYM=8, COLOR='0000ff'x
여기서는 OPLOT 명령에서 x, y 데이터를 플롯으로 표출하는데 있어서 PSYM 키워드의 값을 8로 설정했음을 주목해야 합니다. 즉 앞서 USERSYM 명령으로 정의된 커스텀 심볼이 사용되도록 하려면 이와 같이 해야 합니다. 그리고 여기서는 그래픽창의 배경색 및 플롯의 색상을 16진법 방식으로 정의하였는데, DG 체계에서 단일 색상을 이와 같이 정의하는 방식에 관한 자세한 내용은 관련 게시물을 참조하시면 됩니다. 어쨌든 이 과정에 의하여 표출된 그림은 다음과 같습니다.
만약 심볼의 크기를 더 키우고 내부를 색상으로 채우고 싶다면 어떻게 해야 할까요? 일단 내부를 색상으로 채우는 것은 PLOT 명령에서는 안되고 다음과 같이 USERSYM 명령에서 /FILL 키워드를 함께 사용하여 처리하면 됩니다.
USERSYM, sx, sy, /FILL
그리고 심볼의 크기는 PLOT 명령에서도 조절할 수 있습니다. 다음과 같이 SYMSIZE 키워드를 사용하면 됩니다.
OPLOT, x, y, PSYM=8, COLOR='0000ff'x, SYMSIZE=2
이러한 변화가 반영된 결과는 다음 그림과 같습니다.
< NG 체계의 플롯에서 적용 >
이번에는 사용자 정의 심볼을 NG 체계의 그래픽에서 적용해봅시다. 이를 위해서는 PLOT 함수에서 SYM_OBJECT 속성을 사용해야 합니다. 그런데 이 SYM_OBJECT 속성에는 객체(Object)의 형태로 구현된 폴리곤(Polygon) 또는 폴리라인(Polyline) 개체만 부여할 수 있습니다. 따라서 다음과 같이 OBJ_NEW 함수를 사용하여 심볼에 해당되는 객체를 정의하는 것이 먼저 필요합니다.
oSym = OBJ_NEW('IDLgrPolyline', sx, sy)
여기서는 폴리라인 클래스인 oSym이라는 이름의 객체로 심볼을 정의하였습니다. 그 다음에는 바로 표출 과정으로 넘어가면 됩니다.
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, LINESTYLE=6, YRANGE=[0, 5], $
SYM_OBJECT=oSym, SYM_COLOR='red', $
FONT_SIZE=11, /CURRENT)
이와 같이 PLOT 함수의 SYM_OBJECT 속성에 oSym 객체를 부여하면 됩니다. 표출된 그림은 다음과 같습니다.
만약 심볼의 크기를 더 키우고 내부를 색상으로 채우고 싶다면 어떻게 해야 할까요? 일단 크기를 조절하는 것은 PLOT 함수의 SYM_SIZE 속성을 사용하면 됩니다. 그리고 내부를 색상으로 채우는 것은 원래는 PLOT 함수에서 /SYM_FILLED 속성을 사용하면 되는데, 제가 확인한 바로는 이러한 경우에 한해서는 이 SYM_FILLED 속성이 반영되지 않는 것으로 압니다. 따라서 다른 방식으로 처리를 해줘야 하는데, 그 방법은 처음에 심볼 객체를 정의할 때 폴리라인 대신 폴리곤 객체로 정의하는 것입니다. 즉 다음과 같습니다.
oSym = OBJ_NEW('IDLgrPolygon', sx, sy)
그리고 PLOT 함수의 내용은 다음과 같이 수정합니다.
p = PLOT(x, y, LINESTYLE=6, YRANGE=[0, 5], $
SYM_OBJECT=oSym, SYM_COLOR='red', SYM_SIZE=2, $
FONT_SIZE=11, /CURRENT)
이와 같이 처리하면 됩니다. 결과는 다음 그림과 같습니다.
따라서 NG 체계에서 사용자 정의 심볼을 정의할 때에는 그 목적에 따라 폴리라인 또는 폴리곤 클래스의 객체로 생성하고 이 객체를SYM_OBJECT 속성에 부여하면 됩니다.
< 그 외 다른 형태의 심볼들의 정의 >
앞선 예제에서는 정사각형의 심볼을 정의하여 적용해보았는데, 다른 형태도 얼마든지 가능합니다. 만약 정사각형을 특정한 각도만큼 회전시킨 형태가 되도록 하려면 회전 변환을 해주면 됩니다. 예를 들어 정사각형을 반시계 방향으로 30도 회전시킨 형태의 심볼을 정의하여 NG 체계에서 사용하고자 한다면 그 과정은 다음과 같습니다.
sx = [-1, -1, 1, 1, -1]
sy = [-1, 1, 1, -1, -1]
angle = 30.0
sx_rot = sx*COS(angle*!DTOR)-sy*SIN(angle*!DTOR)
sy_rot = sx*SIN(angle*!DTOR)+sy*COS(angle*!DTOR)
sx = sx_rot
sy = sy_rot
oSym = OBJ_NEW('IDLgrPolyline', sx, sy)
이렇게 정의된 심볼 객체를 NG 체계에서의 표출 과정에 그대로 적용시켜본 결과는 다음 그림과 같습니다.
그리고 심볼을 화살표 형태로 정의해보는 것도 가능한데 그 과정은 다음과 같습니다.
sx = [-1, 1, 0.5, 1, 0.5]
sy = [0, 0, 0.5, 0, -0.5]
여기서는 오른쪽으로 향하는 화살표의 형태로 정의하였습니다. 이 심볼 객체를 NG 체계에서의 표출 과정에 그대로 적용시켜본 결과는 다음 그림과 같습니다.
이와 같은 방식으로 여러가지 다양한 형태의 사용자 정의 심볼을 제작하여 사용하는 것이 얼마든지 가능하다는 것을 참고해두시면 좋을 것 같습니다.
'IDL > Direct Graphics' 카테고리의 다른 글
DG 체계에서 컬러테이블에 없는 색상 사용하기 (0) | 2022.06.17 |
---|---|
모든 컬러테이블들을 한꺼번에 보기 (0) | 2022.06.14 |
DG 체계에서 RGB 색상 사용법 (0) | 2022.01.25 |
DG 체계에서 RGB 컬러 지정 방법 (0) | 2021.06.23 |
DG 체계에서 Colorbar 사용 방법 (0) | 2017.05.19 |