IDL/Programming

HISTOGRAM 및 HIST_2D 함수의 활용 [2]

이상우_IDL 2022. 1. 6. 15:10
728x90

지난 회차에서는 HISTOGRAM 함수의 사용법 및 관련 예제를 소개하였고, 오늘은 이어서 HIST_2D 함수에 관하여 살펴보겠습니다. 지난 회에서도 언급했듯이 HISTOGRAM 함수와 HIST_2D 함수는 데이터에 대하서 구간별 빈도 분포를 집계한다는 점은 동일하지만 그 구간들을 1차원적으로 정의하느냐 2차원적으로 정의하느냐에 따른 차이입니다. 그리고 HIST_2D 함수는 아무래도 그 특성상 2차원적인 공간상에 분포하는 데이터를 대상으로 할 경우가 많습니다. 그러면 지금부터 HIST_2D 함수의 사용법 및 관련 예제를 살펴보도록 하겠습니다.

 

먼저 대상이 될 데이터는 X축 방향으로 대략 0~100 그리고 Y축 방향으로도 대략 0~100 사이의 범위 내에서 분포하는 1000개의 데이터 포인트들로 가정하였습니다. 그래서 1000개의 데이터 포인트들에 대한 X 및 Y 좌표값들을 다음과 같이 xx 및 yy라는 이름으로 정규분포 기반의 난수들이 되도록 하였습니다.

 

xx = RANDOMU(seed, 1000, /NORMAL)*10+50
yy = RANDOMU(seed, 1000, /NORMAL)*10+50
HELP, xx, yy
PRINT, MIN(xx), MAX(xx)
PRINT, MIN(yy), MAX(yy)

 

제가 생성한 xx 및 yy에 관한 정보는 다음과 같습니다. 난수 기반으로 생성된 것이기 때문에 여러분의 결과와는 약간 다를 것입니다.

 

XX              FLOAT     = Array[1000]
YY              FLOAT     = Array[1000]
      19.5199      78.7933
      15.4088      78.2260

 

일단 이러한 데이터가 2차원 공간상에 어떻게 분포하는지를 확인하기 위하여 다음과 같이 SCATTERPLOT 함수를 사용하여 데이터 포인트들을 있는 그대로 표출해보는 것이 좋습니다. 그 과정은 다음과 같습니다.

 

win0 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
sc = SCATTERPLOT(xx, yy, XRANGE=[0, 100], YRANGE=[0, 100], $
  SYMBOL='circle', /SYM_FILLED, SYM_COLOR='black', SYM_SIZE=0.5, $
  TRANSPARENCY=50, MARGIN=0.1, /CURRENT)

 

그리고 표출 결과는 다음 그림과 같습니다. X 및 Y 좌표값들이 정규분포 기반의 난수들이다보니 전반적으로 중심부(좌표값 50 근방)로 갈수록 데이터 포인트들이 많이 분포하고 있습니다.

 

 

그러면 이러한 데이터에 대하여 2차원적인 구간 즉 구획(Sector)들을 정의하고 각 구획별 데이터 분포 갯수를 집계하기 위하여 HIST_2D 함수를 사용해봅시다. 그 과정은 다음과 같습니다.

 

bsx = 10
bsy = 10
h2d = HIST_2D(xx, yy, BIN1=bsx, BIN2=bsy, $
  MIN1=0, MAX1=100-bsx, MIN2=0, MAX2=100-bsy)
HELP, h2d
PRINT, MIN(h2d), MAX(h2d)

 

여기서는 HIST_2D 함수의 사용법에 주목해야 하는데요. 먼저 필수 인수로서 xx, yy가 사용되었습니다. 그리고 BIN1, BIN2, MIN1, MAX1, MIN2, MAX2 등의 키워드들이 사용되었는데요. BIN1, MIN1, MAX1은 X축 방향의 구간들에 대하여 세부 구간의 크기, 전체 구간의 시작 및 끝 값에 해당됩니다. BIN2, MIN2, MAX2는 Y축 방향에 해당됩니다. 구간들을 정의하는 방식은 지난 회차에서 HISTOGRAM 함수를 사용했던 방식과 거의 유사합니다. 즉 여기서는 X 및 Y 방향 모두 전체 구간은 0~100 그리고 세부 구간의 크기를 10으로 정의한 것입니다. 그 결과는 h2d라는 이름으로 얻었는데 관련하여 출력된 정보는 대략 다음과 같습니다.

 

H2D             LONG      = Array[10, 10]
           0         125

 

즉 h2d는 10x10의 2차원 배열로 얻어졌는데 이것은 10x10의 구획들 각각에 대한 빈도수 집계 결과를 얻었다는 뜻입니다. 그리고 h2d에 대한 최소값 및 최대값은 0과 125로 얻어졌는데 가장 빈도수가 높은 구획에 대한 수치가 125라는 의미가 될 것입니다. 모든 구획들에 대한 빈도수를 출력해보면 다음과 같습니다.

 

PRINT, h2d, FORMAT='(10I5)'

 

    0    0    0    0    0    0    0    0    0    0
    0    0    0    0    0    1    0    0    0    0
    0    0    0    3   11    5    4    0    0    0
    0    0    3   17   39   51   18    3    0    0
    0    0    7   39  125  108   55    6    0    0
    0    0    5   45  106  125   55    7    0    0
    0    1    3   15   42   52   20    2    0    0
    0    0    0    8    7    8    4    0    0    0
    0    0    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0    0    0

 

이와 같이 결과를 h2d라는 2차원 배열의 형태로 얻었고 그 다음은 표출 과정이 될텐데요. 이러한 결과를 어떻게 표출할 것인가에 대해서는 여러가지 방식들이 있겠지만, 여기서는 이미지의 형태로 표출을 해보겠습니다. 그 과정은 다음과 같습니다.

 

ct = COLORTABLE(3, /REVERSE)
x = [0:100-bsx:bsx]
y = [0:100-bsy:bsy]
win1 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
im = IMAGE(h2d, x, y, RGB_TABLE=ct, $
  AXIS_STYLE=2, MARGIN=0.1, FONT_SIZE=10, /CURRENT)

 

여기서는 IMAGE 함수를 사용하였는데 h2d 외에도 x, y도 별도로 생성하여 인수들로 함께 사용하였습니다. 이것은 이미지를 구성하는 격자들의 X 및 Y 방향의 위치에 대한 1차원 배열을 함께 명시하는 방식입니다. 그리고 컬러테이블은 3번 컬러테이블의 색상들을 순서를 뒤집어서 사용하였습니다. 이는 빈도수가 높은 구획일수록 진한 색상으로 표시되도록 하기 위함입니다. 표출 결과는 다음 그림과 같습니다.

 

 

이와 같이 빈도수가 높은 구획일수록 진한 색상으로 표시된 것을 볼 수 있습니다. 물론 이것은 표출 방식의 한가지 예일 뿐이고 여러가지 다른 방식의 표출도 가능할 것입니다. 예를 들면 다음과 같이 구획별 빈도수와 이미지를 적절히 중첩하는 방식도 고려해볼 수 있을 것입니다.

 

 

어쨌든 중요한 것은 HIST_2D 함수를 사용하여 2차원적인 공간 분포 데이터에 대한 구획별 빈도 분포 결과를 얻을 수 있다는 것이 가장 중요한 핵심이 될 것입니다. 오늘 예제의 경우도 구획의 크기 및 범위를 얼마든지 조정하여 테스트해볼 수 있으며 이 부분은 여러분들이 직접 해보시길 권장합니다.

 

그러면 2회에 걸쳐서 HISTOGRAM 및 HIST_2D 함수를 소개하는 내용은 여기서 마무리하도록 하겠습니다.

LIST