IDL/New Graphics

날짜 기반의 데이터를 읽고 표출하기 [2]

이상우_IDL 2019. 9. 9. 23:47
728x90

* 이전 게시물의 내용에서 이어집니다.


이제 지난 회에서 그렸던 그림에 대하여 여러가지 추가적인 손질을 좀 해보겠습니다. 원활한 진행을 위하여 그래픽 표출에 사용되었던 코드의 내용은 여기서 다시 제시합니다.


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

pl = PLOT(tjs, speeds, COLOR='crimson', $

  XTICKUNITS='hour', XTICKINTERVAL=6, $

  XTICKFORMAT='(C(CMoA, " ", CDI, " ", CHI2.2, ":", CMI2.2))', $

  TITLE='Solar Wind Speed', $

  MARGIN=0.1, FONT_SIZE=10, /CURRENT)


이 상태로 실행하면 지난 회 마지막에 표출했던 것과 같은 그림을 얻게 됩니다. 이제 이 상태에서 Y축의 범위를 다음과 같은 방식으로 조정해 봅시다.


pl.YRANGE = [200, 500]


이와 같은 명령을 추가적으로 실행하면 Y축의 범위를 200~500으로 재설정하게 됩니다. 그 모습은 다음 그림과 같습니다.



그리고 이번에는 X축의 눈금 간격을 재조정해 봅시다. 이전까지는 6시간으로 되어 있었는데, 이번에는 다음과 같은 방식으로 4시간으로 바꾸면 됩니다.


pl.XTICKINTERVAL = 4


이렇게 하면 결과는 다음 그림과 같습니다.



그런데 이렇게 하면 보시는 바와 같이 눈금별로 표시된 문자들이 서로 겹쳐지는 안타까운 현상이 발생하게 됩니다. 눈금별 문자가 다소 긴 편이었기 때문에 충분히 예견되었던 일이긴 합니다. 사실 이와 같이 날짜/시각 기반의 데이터 표출에 있어서는 X축의 눈금이 날짜/시각에 대응되고 눈금마다 표시되는 날짜/시각 캡션 문자의 내용이 다소 길어지는 경우가 종종 발생합니다. 이런 경우에 어떻게 하면 눈금별 문자에 대한 가독성을 높일 수 있느냐도 나름 중요한 이슈가 됩니다. 일단 한가지 방법으로는 눈금별 문자의 기울기(?)를 조정하는 것을 생각해 볼 수 있습니다. 그 방법은 다음과 같이 XTEXT_ORIENTATION 속성을 사용하는 것입니다.


pl.XTEXT_ORIENTATION = 45


이렇게 하면 결과는 다음 그림과 같습니다.



이와 같이 눈금별 문자의 기울기를 45도로 기울일 수 있으며, 이런 방식으로 눈금별 문자들이 겹쳐 보이는 것을 어느 정도는 피할 수 있습니다. 하지만 그 대신에 그림에서 보는 바와 같이 눈금별 문자들을 제대로 표시하기에는 하단의 여백이 모자라는 경우가 발생할 수 있습니다. 따라서 이런 경우에는 그림의 하단 여백을 재조정하는 것이 필요합니다. 여백 조정에 관한 부분은 잠시 후에 언급하기로 하고, 일단 이번에는 다음과 같이 90으로 설정하여 아예 수직으로 기울여 봅시다.


pl.XTEXT_ORIENTATION = 90


이렇게 하면 결과는 다음 그림과 같습니다.





그러면 이제 하단 여백에 대한 재설정을 해봅시다. 이를 위해서는 PLOT 함수의 MARGIN 속성에 대한 조정이 필요합니다. 다만 MARGIN의 경우는 후속 설정이 안되고, PLOT 함수를 처음 사용할 때에만 설정이 가능하다는 것을 유의해야 합니다. 따라서 PLOT 함수가 사용되었던 내용만 다음과 같이 바꿔주면 됩니다. 실제로는 이미 작성된 내용에서 MARGIN 부분만 아래 내용을 참조해서 수정하면 될 것입니다.


pl = PLOT(tjs, speeds, COLOR='crimson', $

  XTICKUNITS='hour', XTICKINTERVAL=6, $

  XTICKFORMAT='(C(CMoA, " ", CDI, " ", CHI2.2, ":", CMI2.2))', $

  TITLE='Solar Wind Speed', $

  MARGIN=[0.1, 0.2, 0.1, 0.1], FONT_SIZE=10, /CURRENT)


이렇게 하면 결과는 다음 그림과 같습니다.





이와 같이 하단에 충분한 여백을 확보하여 X축 눈금 문자들이 온전히 보이게끔 처리해보았습니다. 다만 여백 설정의 효과는 IDL이 구동되는 PC의 OS나 해상도 등에 따라 다르게 보일 수도 있습니다. 따라서 여러분들의 PC에서는 0.2가 아닌 다른 값으로 조정해야 할 수도 있다는 가능성을 염두에 두시기 바랍니다.


눈금별 문자의 표시와 관련하여 이번에는 다른 시도를 해보겠습니다. 앞선 예제에서는 눈금 문자를 수직 방향으로 기울였는데, 수평 방향일 경우 서로 겹치는 문제로 인하여 그렇게 처리한 것입니다. 그러면 수평 방향을 유지하면서도 서로 가급적 겹치지 않도록 하고 싶다면 어떻게해야 할까요? 이를 위한 방법도 있습니다. 다만 약간의 요령이 필요합니다. 이 방법에 관한 원활한 소개를 위하여 다음과 같이 PLOT 함수를사용하여 처음부터 플롯을 다시 표출해보겠습니다. 여러분도 앞서 실행했던 PLOT 함수 및 그 이후의 내용들은 모두 지우고 다음 내용으로 새롭게 시작해 봅시다.


pl = PLOT(tjs, speeds, YRANGE=[200, 500], COLOR='crimson', $

  XTICKUNITS='hour', XTICKINTERVAL=3, $

  XTICKFORMAT='(C(CHI2.2, ":", CMI2.2))', $

  MARGIN=[0.1, 0.15, 0.1, 0.1], FONT_SIZE=10, /CURRENT)


처음에 표출했던 플롯과의 차이점은 X축 눈금 간격을 3시간으로 더 좁혔다는 것과 하단 여백을 0.15로 처리한 것, 그리고 X축 눈금값의 서식을 변경한 것 등입니다. 서식 변경과 관련해서는 잠시 후 설명을 드리겠습니다. 일단 이 결과는 다음 그림과 같습니다.



그런데 이 그림을 잘 보면 X축 눈금 문자가 시분만 표시된 것을 알 수 있습니다. 원래는 월일시분 다 있었는데 이러면 사기 아니냐 싶을 수도있는데, 그건 아니고 월일은 별도로 하단에 표시하려는 의도입니다. 이를 위하여 일단 다음과 같은 내용을 추가적으로 실행해 봅시다. 추가된 내용에 관한 설명은 바로 이어서 드리겠습니다.


ax_yp2 = pl.YRANGE[0]-(pl.YRANGE[1]-pl.YRANGE[0])*0.04

pl_ax2 = AXIS('X', LOCATION=ax_yp2, TICKINTERVAL=3, $

  TICKFORMAT='(C(CMoA, " ", CDI))', TICKLAYOUT=1)


이렇게 하면 결과는 다음 그림과 같습니다.



그림을 보시면 제 의도가 무엇이었는지 이해가 되실 겁니다. 즉 시분을 우선 기본적인 눈금 문자로 사용하고, 월일은 일종의 보조적인 눈금 문자의 느낌으로 하단에 표시하는 방식입니다. 이렇게 하면 굳이 눈금 문자를 90도로 기울이지 않으면서도 어느 정도 가독성있게 눈금 문자들을 표시하는 것이 가능합니다.


다만 이를 위하여 추가된 위의 내용이 다소 복잡해 보일 수 있습니다. 여기서는 특히 AXIS라는 함수가 사용되었는데요. AXIS 함수는 NG 체계에서 축(axis)을 별도로 추가해야 할 때 주로 사용하는 그래픽 함수입니다. 그래서 위 내용의 의미는 원래의 플롯 그림의 X축 아래 부분에 또 다른 X축을 추가하라는 것입니다. 이 때 눈금 간격은 메인 플롯과 동일하게 3으로 처리하였고, 눈금 문자의 서식에서는 월일만 명시하였습니다. 그리고 X축의 적절한 수직방향 위치값을 계산하여 ax_xp2라는 변수에 담았습니다. 그리고 TICKLAYOUT 속성의 값이 1로 설정되어 있는데, 이렇게 하면 축을 표출할 때 축 라인은 안보이고 오직 축 눈금 문자들만 보이도록 처리할 수 있습니다. 이 속성의 디폴트 값은 0입니다. 만약 디폴트 그대로 처리할 경우에는 그 모습은 다음 그림과 같습니다. 이 그림을 보면 아마 TICKLAYOUT 속성의 역할이 쉽게 이해될 것입니다.



유사한 방법을 적용하여 년도 값을 더 하단에 추가적으로 표시할 수도 있습니다. 이를 위하여 다음과 같은 내용을 추가하여 실행해 봅시다.


ax_yp3 = pl.YRANGE[0]-(pl.YRANGE[1]-pl.YRANGE[0])*0.08

pl_ax3 = AXIS('X', LOCATION=ax_yp3, TICKINTERVAL=3, $

  TICKFORMAT='(C(CYI4.4))', TICKLAYOUT=1)


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



이와 같은 방식을 이용하면 눈금 문자의 방향을 수평으로 유지하면서 날짜/시각에 관한 좀 더 많은 정보들을 한꺼번에 표시하는 것도 가능하다는 것을 알아두시면 좋을 것 같습니다. 그러면 오늘은 여기까지 진행하기로 하고, 다음 회에는 X축의 범위를 재조정하는 방법과 관련된 내용을 소개하도록 하겠습니다.

LIST