IDL/New Graphics

플롯(Plot) 상에 축과 데이터 추가하기 [2]

이상우_idl 2024. 10. 22. 14:45
728x90
반응형

지난 회차 게시물에서는 NG 체계에서 PLOT 함수를 사용하여 플롯 그림을 표출한 상태에서 AXIS 함수를 사용하여 새로운 축과 새로운 데이터 플롯을 추가하는 방법을 예제와 함께 소개하였습니다. 여기서는 x, y1에 대한 플롯을 먼저 표출한 후 x, y2에 대한 플롯 및 Y축을 추가하는 방식으로 작업을 해보았고 다음과 같은 결과 그림을 얻은 바 있습니다.

 

오늘은 이어지는 예제로서 또 다른 추가 데이터인 y3를 가정하여 x, y3에 대한 플롯 및 Y축을 추가해보고자 합니다. 일단 앞선 예제에서 사용했던 예제 데이터인 x, y1, y2는 그대로 활용하면서 새로운 데이터인 y3까지 다음과 같이 정의합니다.

 

x = FINDGEN(101)
y1 = SQRT(x)
y2 = (x/10)^2+100

y3 = SIN(x*7.2*!DTOR)

 

여기서 새롭게 정의된 y3의 값 범위는 -1~1입니다. 그리고 y1의 값 범위가 0~10이라는 것을 함께 고려해야 합니다. 왜냐하면 지난 회 게시물에서도 언급했듯이, AXIS 함수를 사용하여 새로운 축을 추가하는데 있어서 그 축의 범위가 우리의 의도에 맞게 구현되려면 COORD_TRANSFORM 속성에 적절한 값들이 투입되어야 하기 때문입니다. 일단 x, y1 플롯을 먼저 표출하고 그 위에 x, y2에 대한 축과 플롯을 추가하는 과정까지는 지난 회 게시물과 거의 동일하게 진행합니다. 그 과정은 다음과 같습니다.

 

win = WINDOW(DIMENSIONS=[800, 500], /NO_TOOLBAR)

p = PLOT(x, y1, COLOR='green', YTITLE='Y1', $
  FONT_SIZE=11, MARGIN=[0.1, 0.1, 0.25, 0.1], /CURRENT)
axes = p.AXES
axes[3].HIDE = 1
axes[1].COLOR = 'green'
axo1 = AXIS('Y', LOCATION='right', AXIS_RANGE=[100, 200], $

  COORD_TRANSFORM=[100, 10], $
  COLOR='tomato', TICKFONT_SIZE=11, TITLE='Y2', TARGET=p)
po1 = PLOT(x, y2, AXIS_STYLE=0, COLOR='tomato', MARGIN=[0.1, 0.1, 0.25, 0.1], /CURRENT)

 

다만 이 과정이 지난 회 게시물에서와 완전히 동일하지는 않고 약간의 차이점들이 있습니다. 가장 큰 차이점은 바로 플롯의 우측 여백을 더 확장한 것입니다. 이것은 오늘 추가할 x, y3에 대한 Y축을 플롯의 우측 여백에 배치하기 위해서입니다. 그리고 AXIS 함수에서 TARGET 속성을 추가로 사용한 점 그리고 x, y2에 대한 플롯 및 축 개체의 명칭을 po1 및 axo1으로 변경한 점 등도 지난번과는 약간 다릅니다. 그리고 표출될 그림의 특성을 감안하여 그래픽창의 크기를 가로 방향으로 조금 늘렸습니다. 어쨌든 여기까지의 과정을 실행하면 다음과 같은 그림을 얻게 됩니다.

 

이제 새로운 Y축을 우측 여백의 적절한 위치에 배치해봅시다. 여기서도 AXIS 함수의 사용이 필요합니다. 그 내용은 다음과 같습니다.

 

axo2 = AXIS('Y', LOCATION=120, AXIS_RANGE=[-1, 1], $

  COORD_TRANSFORM=[-1, 0.2], COLOR='blue', TICKFONT_SIZE=11, $

  TITLE='Y3', TICKDIR=1, TEXTPOS=1, TARGET=p)

 

여기서 제시된 AXIS 함수의 내용은 앞서 axo1에 대한 내용과 전반적으로 유사하지만 차이점들이 꽤 있습니다. 가장 중요한 것은 바로 LOCATION 속성이 120이라는 값으로 설정된 것인데요. 이렇게 하면 기존의 x, y1 플롯 상에서 X축의 값이 120인 위치에 새로운 Y축이 추가됩니다. 또한 COORD_TRANSFORM 속성에 주어진 값이 [-1, 0.2]로 되어 있는데, 이것은 앞서 잠시 언급했듯이 기존의 x, y1 플롯의 Y축 범위인 0~10과 x, y3의 Y축 범위인 -1~1 사이의 변환 인자 값들이 이렇게 정의되어야 하기 때문입니다. 즉 0~10에 0.2를 곱하고 -1을 더해주면 -1~1이 됩니다. 또한 TICKDIR 속성 및 TEXTPOS 속성도 눈에 띄는데요. 먼저 위의 내용까지 실행된 결과 그림부터 보고 설명을 이어가겠습니다.

 

이 그림을 보면 기존 플롯의 우측 여백에 새로운 Y축이 추가된 것이 보입니다. 그리고 이 새로운 축의 눈금들의 방향은 안쪽이고 타이틀 문자인 'Y3'의 위치는 바깥쪽인 것도 눈에 띕니다. 앞서 언급한 TICKDIR 속성은 축 눈금들의 방향을 결정하는데, 그 값이 1이면 위와 같이 안쪽을 향하게 되지만 0이면 바깥쪽을 향하게 됩니다. 그리고 TEXTPOS 속성은 축 타이틀 문자의 위치를 결정하는데, 그 값이 1이면 바깥쪽에 위치하고 0이면 안쪽에 위치하게 됩니다. 여기서는 이 두 속성들이 모두 1로 설정되어 있기 때문에 위와 같은 모습이 되었습니다. 만약 이 두 속성들의 값을 모두 0으로 설정하는 경우를 살짝 들여다본다면 결과는 다음 그림과 같을 것입니다.

 

물론 이것은 우리가 원하던 모습은 아닐 것이므로, 여기서는 다시 두 속성들의 값을 원래대로 1로 되돌려놓고 진행하겠습니다. 이제 나머지 작업은 x, y3에 대한 플롯을 추가하면서 그 선(Line)만 추가되도록 하는 작업일 것입니다. 이를 위하여 다음과 같은 내용을 추가합니다.

 

po2 = PLOT(x, y3, AXIS_STYLE=0, COLOR='blue', MARGIN=[0.1, 0.1, 0.25, 0.1], /CURRENT)

 

여기까지의 내용을 실행하면 그 결과는 다음 그림과 같을 것입니다.

 

이와 같이 플롯 상에 새로운 축 및 데이터를 추가하기 위해서는 AXIS 함수의 활용이 반드시 필요합니다. 그리고 지난 회 및 이번 회에서 소개된 예제에서는 Y축을 추가하는 방식으로 예제를 소개하였는데, X축을 추가하는 경우도 그 원리는 비슷합니다. 다만 AXIS 함수의 첫번째 인수가 'X'가 되어야 할 것이고, 새로운 X축이 추가될 위치 및 관련 속성들을 적절하게 설정하는 것이 필요할 것입니다. X축을 추가하는 경우에 대한 간단한 예제 및 결과 그림은 아래에 소개해둡니다. 다만 예제 코드에 대한 자세한 설명은 생략합니다.

 

x1 = FINDGEN(101)
x2 = FINDGEN(101)*0.15+50
x3 = FINDGEN(101)*6+3000
y = SIN(x*7.2*!DTOR)
p = PLOT(x1, y, XTITLE='X1', FONT_SIZE=11, MARGIN=[0.1, 0.35, 0.1, 0.05], /CURRENT)
axo1 = AXIS('X', LOCATION=-1.4, AXIS_RANGE=[50, 65], $

  COORD_TRANSFORM=[50, 0.15], COLOR='tomato', TICKFONT_SIZE=11, $

  TITLE='X2', TICKINTERVAL=5, TARGET=p)
axo2 = AXIS('X', LOCATION=-1.8, AXIS_RANGE=[3000, 3600], $

  COORD_TRANSFORM=[3000, 6], COLOR='blue', TICKFONT_SIZE=11, $

  TITLE='X3', TICKDIR=0, TEXTPOS=0, TARGET=p)

 

 

 

 

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

반응형