IDL/New Graphics

색상을 채운 플롯(Filled Plot)의 표출 [2]

이상우_IDL 2025. 3. 13. 15:29
728x90

지난 회차 게시물에서는 IDL에서 색상을 채운 플롯을 표출하는 방법을 소개하였는데, 수평 방향으로 색상을 채운 플롯을 표출하는데 있어서 기본적으로는 FILLPLOT 함수를 사용하면 되지만 그냥 PLOT 함수를 사용해도 구현이 가능하다는 것도 확인한 바 있습니다. 오늘은 이어지는 순서로서 연직(수직) 방향(Vertical Direction)으로 색상을 채운 플롯을 구현하는 방법을 살펴보고자 합니다.

 

사실 연직 방향의 경우는 구현 방법이 약간 다릅니다. 일단 FILLPLOT 함수는 연직 방향의 플롯에 대하여 색상을 채우는 기능을 지원하지 않는다는 것을 유의해야 합니다. 오직 수평 방향의 플롯에 대하여 색상을 채우는 것만 가능합니다. 따라서 오늘의 작업에서는 FILLPLOT 함수는 등장하지 않습니다. 그 대신 PLOT 함수 및 POLYGON 함수를 함께 사용하는 방식으로 처리하게 됩니다. 즉 POLYGON 함수를 사용하여 색상을 채운 상태에서 PLOT 함수를 사용하여 플롯 라인을 추가로 표시하는 방식으로 작업을 진행하게 된다는 차이점이 있습니다. 그러면 먼저 예제 데이터를 다음과 같이 정의해봅시다.

 

n = 101
y = FINDGEN(n)
x1 = SQRT(100-y)+3+RANDOMU(-1, n)*4-2
x2 = SQRT(100-y)*2.5+6+RANDOMU(-2, n)*4-2
x3 = SQRT(100-y)*4+9+RANDOMU(-3, n)*4-2

 

여기서는 연직 방향의 데이터라는 특성상 동일한 Y 데이터에 대한 3종의 X 데이터가 존재하는 것으로 가정하였습니다. 따라서 위와 같이 y 및 x1, x2, x3을 정의한 것입니다. 어차피 가상의 데이터이긴 하지만 표출의 특성을 감안하여 여기서는 y가 고도(Height) 값들이고 x1, x2, x3은 서로 다른 물리량들이라고 가정해봅시다. 즉 고도에 따라 값이 변하는 3종의 물리량들로 구성된 데이터라고 가정해보는 것입니다. 실제로 이러한 데이터를 가시화해야 하는 경우는 종종 있습니다. 그러면 이제 표출 과정으로 넘어가야 하는데, 일단 그래픽창을 띄우고 플롯 공간 즉 X 및 Y축으로 구성된 2차원 공간을 표시하는 과정까지만 다음과 같이 진행해봅시다.

 

win1 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
p1 = PLOT(x1, y, /NODATA, XTITLE='Value', YTITLE='Height', $

  XRANGE=[0, 60], YRANGE=[0, 100], MARGIN=0.1, $

  FONT_SIZE=11, /CURRENT)

 

여기서는 PLOT 함수에서 /NODATA 키워드를 사용하여 데이터 플롯 자체는 표시되지 않고 그냥 축들만 표시되도록 하였습니다. 일단 여기까지의 표출 결과는 다음 그림과 같습니다.

 

이제는 y1, y2, y3 데이터들에 대한 연직 방향의 플롯을 색상이 채워진 형태로 구현할 차례입니다. 앞서 정의한 x1, x2, x3 배열들 중에서 값들이 가장 큰 x3 배열에 대한 표출부터 먼저 진행하고 그 다음에 x2, x1의 순서로 이어질 예정입니다. 즉 색상이 채워진 플롯을 표출하는데 있어서는 이와 같이 값들이 가장 큰 배열 데이터에 대한 작업부터 먼저 해야 합니다. 만약 순서가 반대가 될 경우에는 나중에 표출되는 플롯이 이전에 표출된 플롯을 덮어버리기 때문입니다. 어쨌든 이 작업은 배열 데이터를 적용하여 색상이 채워진 폴리곤(Polygon)을 먼저 표시한 후 플롯 라인을 표시하는 방식으로 처리하면 됩니다. 앞서 언급했듯이 x3 배열 데이터에 대한 작업부터 먼저 진행하면 그 과정은 다음과 같습니다.

 

p1pg_a = POLYGON([x3, 0, 0, x3[0]], [y, 100, 0, y[0]], /DATA, $

  /FILL_BACKGROUND, FILL_COLOR='khaki', TARGET=p1)
p1p_a = PLOT(x3, y, COLOR='blue', THICK=2, /OVERPLOT)

 

여기서는 POLYGON 함수에 인수로 투입된 내용(볼드체)을 주목해야 하는데, 색상이 채워질 폴리곤의 꼭지점들에 대한 X좌표들로 구성된 배열 및 Y좌표값들로 구성된 배열입니다. 이 좌표값들은 기본적으로 (x3, y) 플롯의 라인을 구성하는 점들 그리고 좌표가 (0, 100) 및 (0, 0)인 점들까지 모두 포함합니다. 바로 이어지는 PLOT 함수에서는 (x3, y) 플롯의 라인만 별도의 색상 및 두께로 표시하였습니다. 표출 결과는 다음 그림과 같습니다.

 

다음 순서의 작업은 배열의 값들이 x3 다음으로 큰 배열 x2로 대상 데이터만 바뀔 뿐 작업 방식 자체는 위와 동일합니다. 그 과정은 다음과 같습니다.

 

p1pg_b = POLYGON([x2, 0, 0, x2[0]], [y, 100, 0, y[0]], /DATA, $

  /FILL_BACKGROUND, FILL_COLOR='salmon', TARGET=p1)
p1p_b = PLOT(x2, y, COLOR='blue', THICK=2, /OVERPLOT)

 

이 과정을 추가로 실행하면 결과는 다음 그림과 같습니다.

 

다음 순서의 작업은 배열의 값들이 가장 작은 배열 x1로 대상 데이터만 바뀔 뿐이고 역시 작업 방식 자체는 위와 동일합니다. 그 과정은 다음과 같습니다.

 

p1pg_c = POLYGON([x1, 0, 0, x1[0]], [y, 100, 0, y[0]], /DATA, $

  /FILL_BACKGROUND, FILL_COLOR='violet', TARGET=p1)
p1p_c = PLOT(x1, y, COLOR='blue', THICK=2, /OVERPLOT)

 

그러면 결과는 다음 그림과 같습니다.

 

대략 이와 같은 방식으로 작업을 진행하면 됩니다. 각 데이터에 대한 작업때마다 POLYGON 및 PLOT 함수를 연달아 사용해야 한다는 번거로움이 다소 있지만 원하는 결과를 얻기 위해서는 감수해야 할 부분인 것 같습니다.

 

그런데 위의 내용에서는 예제 데이터가 고도(y) 및 물리량들(x1, x2, x3)인 경우로 가정을 해보았는데요. 고도(Height) 대신 깊이(Depth)가 되어야 하는 경우도 있습니다. 즉 지면을 기준으로 위로 올라가면서 측정된 물리량들을 대상으로 하는 경우가 있는가 하면 지면 아래로 내려가면서 측정되는 물리량들이 그 대상인 경우를 의미합니다. 따라서 앞서 정의한 예제 데이터들을 그대로 사용하되 배열 y가 고도가 아닌 깊이에 해당되는 경우로 바꿔서 가정해봅시다. 그러면 표출을 할 때 데이터의 특성에 맞게 배열 y의 값들이 윗방향이 아닌 아랫방향으로 증가하는 형태로 보이도록하는 것이 더 나을 수도 있습니다. 이러한 방식의 표출도 물론 가능합니다. 앞서 제시된 예제 코드의 내용에서 몇몇 부분만 살짝 바꿔주면 됩니다. 그러면 이 작업은 새로운 그래픽창을 띄우고 해봅시다. 그 과정은 다음과 같습니다.

 

win2 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
p2 = PLOT(x1, y, /NODATA, XTITLE='Value', YTITLE='Depth', $

  XRANGE=[0, 60], YRANGE=[100, 0], MARGIN=0.1, $

  FONT_SIZE=11, /CURRENT)
p2pg_a = POLYGON([x3, 0, 0, x3[0]], [y, 100, 0, y[0]], /DATA, $

  /FILL_BACKGROUND, FILL_COLOR='khaki', TARGET=p2)
p2p_a = PLOT(x3, y, COLOR='blue', THICK=2, /OVERPLOT)
p2pg_b = POLYGON([x2, 0, 0, x2[0]], [y, 100, 0, y[0]], /DATA, $

  /FILL_BACKGROUND, FILL_COLOR='salmon', TARGET=p2)
p2p_b = PLOT(x2, y, COLOR='blue', THICK=2, /OVERPLOT)
p2pg_c = POLYGON([x1, 0, 0, x1[0]], [y, 100, 0, y[0]], /DATA, $

  /FILL_BACKGROUND, FILL_COLOR='violet', TARGET=p2)
p2p_c = PLOT(x1, y, COLOR='blue', THICK=2, /OVERPLOT)

 

여기서 주목할 부분은 기본 플롯을 구현하는데 있어서 Y축의 범위를 설정할 때 YRANGE 속성을 [100, 0]으로 설정하는 것입니다. 즉 [0, 100] 대신 [100, 0]으로 설정한다는 것이 중요합니다. 그리고 데이터의 특성을 감안하여 Y축 타이틀 문자를 'Height' 대신 'Depth'로 바꾸었습니다. 그 외의 내용은 그래픽 개체들의 명칭만 바뀌었을 뿐 기본 골격은 그대로입니다. 이와 같은 내용을 실행하면 결과는 다음 그림과 같습니다.

 

여기서 Y축 부분을 보면 값들의 순서가 뒤집혀있는 것이 보입니다. 즉 Y의 값이 위로 증가하는 대신 아래로 증가하는 방식으로 표시되어 있습니다. 그리고 데이터의 특성을 좀 더 고려해본다면, X축의 라벨 문자들 및 타이틀 문자 등이 아래쪽 X축에 있는 것보다는 위쪽 X축에 있다면 더 좋을 것 같습니다. 만약 이러한 처리까지도 해본다고 하면 다음과 같은 내용을 추가하면 됩니다.

 

ax2 = p2.AXES
ax2[2].SHOWTEXT = 1
ax2[0].SHOWTEXT = 0

 

여기서는 기본 플롯 개체인 p2를 구성하는 모든 축(Axis) 개체들로 구성된 배열 ax2를 가져온 다음, 그 중에서 상단 X축에 해당되는 ax2[2]에 대해서는 문자들이 모두 보이게 되도록 처리하고 하단 X축에 해당되는 ax2[0]에 대해서는 문자들이 모두 보이지 않도록 처리한 것입니다. 이러한 처리를 거치면 다음과 같은 그림을 얻게 됩니다.

 

그리고 경우에 따라서는 하단 X축 및 우측 Y축이 아예 보이지 않도록 하고 싶은 경우도 있습니다. 그러한 처리는 다음과 같이 해당 축 개체의 HIDE 속성을 1로 설정하여 그 축이 보이지 않도록 처리하면 됩니다.

 

ax2[0].HIDE = 1
ax2[3].HIDE = 1

 

이러한 과정까지 추가로 실행하면 다음과 같은 그림을 얻게 됩니다.

 

오늘 소개된 내용은 연직 방향(Vertical Direction)으로 색상을 채우는 플롯을 구현하는 방법에 관한 것이지만, 결국 이러한 방법론은 연직 방향으로 획득되는 데이터의 표출에 있어서 나름 참고해볼만한 활용법이 되지 않을까 합니다.

 

 

 

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

LIST