IDL/New Graphics

POLARPLOT 함수 소개 [2]

이상우_IDL 2025. 4. 29. 15:11
728x90

POLARPLOT 함수NG 체계에서 극좌표(Polar Coordinate) 기반의 플롯을 표출할 수 있도록 해주는 그래픽 함수로서, 이 함수의 기본적인 역할 및 사용법에 관해서는 예전에 관련 게시물을 통하여 소개를 한 바 있습니다. 다만 이 당시 소개했던 예제 및 표출 그림들을 보면 데이터 포인트들이 모두 동일한 색상으로 표시되어 있습니다. 그러면 예전 게시물에서 사용했던 것과 유사한 방식으로 예제 데이터를 생성하고 POLARPLOT 함수를 사용하여 그림을 표출하는 과정을 먼저 진행해봅시다.

 

n = 61
r = FINDGEN(n)/6
theta = FINDGEN(n)*18*!DTOR
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
p = POLARPLOT(r, theta, AXIS_STYLE=1, $
  SYM_COLOR='black', SYM_FILL_COLOR='orchid' , SYM_THICK=2 , $
  SYMBOL='square', /SYM_FILLED, SYM_SIZE=2, $
  XRANGE=[-10, 10], YRANGE=[-10, 10], $
  XTICKLEN=0.02, YTICKLEN=0.02, $
  LINESTYLE=6, CLIP=0, FONT_SIZE=11, $
  MARGIN=0.1, /CURRENT)

 

이 내용은 61개의 데이터 포인트들로 구성된 극좌표 기반의 데이터를 가상으로 생성하고 POLARPLOT 함수를 사용하여 표출하는 과정입니다. 실행 결과는 다음 그림과 같습니다.

 

 

여기까지는 예전 게시물에서 소개된 내용과 거의 유사합니다. 그런데 오늘은 POLARPLOT 함수의 사용법에 관한 추가적인 내용을 다뤄보고자 하는데요. 즉 데이터 포인트들마다 일정한 데이터 값이 존재하는 경우를 가정해보는 것입니다. 예를 들면 다음과 같은 데이터가 추가적으로 존재하는 경우입니다.

 

data = FINDGEN(n)*5

 

이와 같이 r, theta 배열들과 동일한 구조이지만 각 포인트에 대하여 특정한 데이터 값이 존재하는 경우를 가정해보는 것입니다. 여기서는 이러한 데이터가 data라는 배열로 존재하며 그 값이 0~300의 범위를 갖도록 정의해보았습니다. 그러면 각 데이터 포인트가 해당 데이터 값에 따라 서로 다른 색상으로 표시되도록 하는 것이 가능할까요? 물론 가능합니다. 그래서 POLARPLOT 함수로 그러한 표출을 하는 방법을 소개하는 것이 오늘의 목표입니다.

 

이와 같은 처리에 있어서는 VERT_COLORS 속성 및 RGB_TABLE 속성이 가장 중요한 역할을 합니다. 앞서 정의한 data 배열의 값들이 색상으로 반영되기 위해서는 먼저 그 값들에 대하여 바이트 스케일링 처리를 하여 그 결과를 VERT_COLORS 속성에 부여하는 것이 필요합니다. 또한 이 때 사용하고자 하는 색상 체계에 해당되는 컬러테이블을 RGB_TABLE 속성으로 설정하는 것도 필요합니다. 이러한 작업들이 가장 핵심이라고 보면 됩니다. 다만 이러한 처리가 제대로 반영되도록 하려면 앞서 POLARPLOT 함수가 사용된 내용에서 SYM_COLOR 및 SYM_FILL_COLOR 속성들을 삭제해야 합니다. 따라서 이와 같은 사항들을 염두에 두고 앞서 POLARPLOT 함수가 사용되었던 내용을 다음과 같이 수정하면 됩니다.

 

p = POLARPLOT(r, theta, AXIS_STYLE=1, $
  RGB_TABLE=34, VERT_COLORS=BYTSCL(data), $
  SYMBOL='square', /SYM_FILLED, SYM_SIZE=2, $
  XRANGE=[-10, 10], YRANGE=[-10, 10], $
  XTICKLEN=0.02, YTICKLEN=0.02, $
  LINESTYLE=6, CLIP=0, FONT_SIZE=11, $
  MARGIN=0.1, /CURRENT)

 

여기서는 34번 컬러테이블이 사용되도록 하였습니다. 그리고 앞서 사용했던 SYM_THICK 속성의 사용이 여기서는 의미가 없기 때문에 이 속성도 삭제하였습니다. 이러한 수정사항들을 반영하여 다시 실행해보면 결과는 다음 그림과 같습니다.

 

 

이와 같이 각 포인트의 데이터 값에 따라 컬러테이블의 색상이 대응되도록 하는 것이 가능합니다. 그리고 이러한 표출에 있어서 컬러바가 빠질 수 없으므로 다음과 같이 COLORBAR 함수를 사용하여 상단에 컬러바가 표시되도록 하는 내용도 추가합시다.

 

cb = COLORBAR(TARGET=p, RANGE=[0, 300], /BORDER, $
  TITLE='my polar data', FONT_SIZE=10, $
  POSITION=[0.2, 0.94, 0.8, 0.97])

 

이러한 내용까지 실행되면 결과는 다음 그림과 같습니다.

 

 

이번에는 데이터 배열을 다른 것으로 변경해봅시다. 즉 data 배열을 정의하는 내용만 다음과 같이 변경하는 것입니다.

 

data = RANDOMU(-1, n)*300

 

물론 여기서 정의된 data 배열 역시 편의상 값 범위가 이전과 동일하게 0~300이 되도록 해보았습니다. 이러한 변경사항만 반영하여 다시 실행해보면 결과는 다음 그림과 같을 것입니다.

 

 

어쨌든 이와 같은 방식으로 POLARPLOT 함수를 사용하면 극좌표 기반으로 분포하는 데이터가 있을 때 이들을 표시하면서 각 데이터 값에 따라 다양한 색상들로 표시되도록 하는 것이 가능합니다. 사실 이러한 표출에 있어서 POLARPLOT 함수를 사용하는 것만이 유일한 해결책인 것은 아닙니다. 이전에 이미 소개되었던 SCATTERPLOT 또는 BUBBLEPLOT 함수를 사용하는 방법도 있습니다. 다만 SCATTERPLOT 및 BUBBLEPLOT 함수들의 경우는 무조건 직교 좌표 체계(Cartesian Coordinate) 기반으로만 좌표 데이터를 받는다는 것을 유의해야 합니다. 즉 (r, theta)가 아닌 (X, Y) 좌표 체계로만 사용이 가능합니다. 따라서 만약 오늘 사용한 예제 데이터와 같이 극좌표 기반의 데이터가 주어질 경우에는 이들을 직교 좌표 기반으로 변환하는 중간 과정이 필요하다는 것을 염두에 두어야 합니다. 물론 이러한 변환 과정이 그리 어렵거나 복잡한 것은 아닙니다.

 

그러면 앞서 맨 처음에 정의했던 가상 데이터를 그대로 사용하면서 POLARPLOT 함수 대신 SCATTERPLOT 함수를 사용하여 표출하는 경우를 보면 그 과정은 다음과 같습니다.

 

n = 61
r = FINDGEN(n)/6
theta = FINDGEN(n)*18*!DTOR

data = FINDGEN(n)*5

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
x = r*COS(theta)
y = r*SIN(theta)
p = SCATTERPLOT(x, y, AXIS_STYLE=1, $
  RGB_TABLE=34, MAGNITUDE=BYTSCL(data), $
  SYMBOL='square', /SYM_FILLED, SYM_SIZE=2, $
  XRANGE=[-10, 10], YRANGE=[-10, 10], $
  XTICKLEN=0.02, YTICKLEN=0.02, $
  CLIP=0, FONT_SIZE=11, MARGIN=0.1, /CURRENT)
cb = COLORBAR(TARGET=p2, RANGE=[0, 300], /BORDER, $
  TITLE='my polar data', FONT_SIZE=10, $
  POSITION=[0.2, 0.94, 0.8, 0.97])

 

여기서 가장 중요한 것은 SCATTERPLOT 함수에 투입될 좌표 데이터는 직교 좌표계(Cartesian Coordinate) 기반이어야 하기 때문에 위와 같이 COS 및 SIN 함수를 사용하여 x, y로 변환하는 과정이 필요하다는 것입니다. 그리고 SCATTERPLOT 함수의 특성에 맞도록 RGB_TABLE 및 MAGNITUDE 속성을 사용했다는 것도 유념해야 합니다. 표출 결과는 다음 그림과 같습니다.

 

 

이와 같이 앞서 POLARPLOT 함수를 사용하여 얻은 그림과 거의 동일합니다. 따라서 어떤 그래픽 함수를 사용하든 유저의 필요에 따라서 더 선호하는 방법을 선택하면 될 것입니다.

 

 

이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

LIST