IDL/New Graphics

에러바(Error Bar)의 표출

이상우_idl 2015. 12. 17. 15:23
728x90
반응형

오늘은 IDL에서 에러바(Error Bar)의 표출 방법에 관한 얘기를 해볼까 합니다. 원래 기존의 Direct Graphics 체계에서는 이러한 역할을 하는 PLOTERR이라는 프로시저가 있었습니다. 하지만 오늘은 New Graphics 체계에서의 에러바 표출 방법에 중점을 두고 소개를 해보고자 합니다. 현 시점에서 에러바 표출 기능을 수행하는 가장 대표적이고 편리한 기능은 바로 NG 체계가 도입된 IDL 8.0 버전에서부터 도입된 ERRORPLOT이라는 그래픽 함수입니다. 이 함수의 사용법은 전반적으로 PLOT 함수와 유사한 측면이 많은데, 에러폭 값들에 해당되는 배열이 추가적인 인자로 필요하다는 것이 가장 큰 차이점입니다. 기본 문법은 다음과 같습니다.


graphic = ERRORPLOT(x, y, err, ~~~)


물론 여기서 err은 x, y와 동일한 구조의 배열이어야 하며, 에러폭에 해당되는 값들을 포함해야 합니다. 데이터 포인트의 XY 좌표를 기준으로 Y축 방향으로 위/아래 방향으로 에러폭만큼 뻗어나가도록 에러바를 그리게 됩니다. 다음과 같은 예제 데이터를 갖고 에러바 플롯을 그려봅시다.


x = [2, 3, 5, 7, 8]

y = [8.5, 11.2, 9.3, 8.1, 12.6]

yerr = [2.4, 1.8, 2.7, 2.2, 1.9]


이와 같은 데이터를 다음과 같이 ERRORPLOT 함수에 투입하면 됩니다. 이와 같이 표출하면 다음 그림과 같은 결과를 얻을 수 있습니다.


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

epl = ERRORPLOT(x, y, yerr, XRANGE=[0, 10], YRANGE=[0, 20], $

  LINESTYLE=2, ERRORBAR_THICK=2, ERRORBAR_COLOR='green', $

  ERRORBAR_CAPSIZE=0.4, SYMBOL='circle', SYM_COLOR='crimson', $

  /SYM_FILLED, SYM_SIZE=1.2, /CURRENT)



여기서는 키워드들이 꽤 많이 사용되고 있는데, 일부는 PLOT 함수에서 지원되는 것들과 유사한 기능을 수행하며, 일부는 에러바의 표출을 위한 세부 설정 기능을 수행합니다. 즉, 이름이 'ERROR_'로 시작하는 것들이 보이는데, 순서대로 각각 선의 두께, 색상 및 양끝 부분 수평선의 폭에 해당됩니다. 그리고 나머지 키워드들은 PLOT에서와 유사한 방식으로 XY 데이터 포인트 자체를 심볼 및 점선으로 표출하도록 설정하였습니다. 어차피 통상적으로 에러바를 그릴 때에는 에러바 자체뿐 아니라 데이터 포인트도 표시를 하는 것이 좋기 때문에 이와 같이 해보았습니다.


위에서 소개한 ERRORBAR 함수는 에러폭을 선형으로 표현한다고 보는 것이 맞습니다. 그런데 이번에는 에러바를 위와는 약간 다른 방식으로 표출을 시도해보려고 합니다. 정말 말 그대로 에러바(Error Bar)라는 용어에 맞게 막대의 형태로 표출해보려는 것인데요. 사실 막대의 형태로 데이터 표출을 하는 기능은 NG 체계에서 BARPLOT이라는 함수가 지원하고 있습니다. 그래서 이 함수는 주로 분포도(Histogram)을 표현할 때 자주 사용됩니다. 이 블로그에서 꽤 오래전에 한번 소개된 적도 있습니다. 그런데 이 함수를 사용하여 위와 같은 에러바를 표출하는 것도 가능합니다. 동일한 데이터에 대하여 다음과 같이 BARPLOT 함수를 사용하면 됩니다.


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

pl = PLOT(x, y, XRANGE=[0, 10], YRANGE=[0, 20], LINESTYLE=2, /CURRENT)

plb = BARPLOT(x, y+yerr, BOTTOM_VALUES=y-yerr, WIDTH=0.3, $

  FILL_COLOR='green', /OVERPLOT)


여기서는 먼저 PLOT 함수로 기본 플롯을 그린 후에 BARPLOT으로 막대들을 덧그려 추가하는 방식을 사용하였습니다. 물론 기본 플롯이 필요없고 그냥 막대들만 표출할 경우에는 바로 BARPLOT 함수를 /CURRENT 키워드와 함께 사용하면 됩니다. 사실 원래는 BARPLOT 함수로 막대 그래프와 같은 그림을 그릴 때, 막대의 시작부분이 항상 Y축의 바닥에서부터인 경우만 우리가 자주 보게 되는데, BARPLOT 함수에는 BOTTOM_VALUES라는 키워드가 있습니다. 즉, 막대의 시작 위치를 직접 지정하는 것이 가능하기 때문에, 다음 그림과 같이 막대가 위에 떠있는 듯한 표출이 가능합니다. 이런 특성을 활용한다면 에러바를 정말 막대의 모습으로 표출하는 것이 가능해집니다.



하지만, 이 그림에서 좀 아쉬운 것은 XY 데이터 포인트가 없다는 것입니다. 앞서 ERRORPLOT 함수로 그렸던 그림에서 붉은색 원형 심볼들에 해당되는 것들이 없는 상태인데요. BARPLOT 함수에서는 사실 심볼들의 사용과 관련된 기능이 지원되지 않습니다. 따라서 약간의 요령을 사용해야 하는데요. 저는 다음과 같이 BARPLOT 함수를 한번 더 활용하는 방식을 사용해 보았습니다.


plbo = BARPLOT(x, y1+0.1, BOTTOM_VALUES=y1-0.1, WIDTH=0.3, $

  FILL_COLOR='gold', /OVERPLOT)


이렇게 표출한 결과는 다음 그림과 같습니다. 어떤 요령이 사용되었는지 감이 오시나요? 위아래 폭이 아주 좁은 바(Bar)를 추가적으로 삽입했다고 보면 됩니다. 제가 보기엔 나름 그럴듯해 보이는 것 같습니다.



이와 같이 BARPLOT 함수를 사용할 경우에는 에러바를 막대의 형태로 표출할 수 있다는 점도 있지만, 또 하나 주목해볼만한 장점이 있는데요. 여러 종류의 데이터들에 대한 에러바를 나란히 중첩해서 그릴 수가 있다는 것입니다. 이것은 BARPLOT 함수에서만 지원되는 NBARS, INDEX 키워드를 사용할 수 있기 때문에 가능한 특징이기도 합니다. 다음과 같은 예제 데이터를 사용해서 이러한 표출을 시도해 봅시다.


x = [2, 3, 5, 7, 8]

y1 = [8.5, 11.2, 9.3, 8.1, 12.6]

yerr1 = [2.4, 1.8, 2.7, 2.2, 1.9]

y2 = [9.8, 10.2, 7.9, 8.2, 12.9]

yerr2 = [1.7, 1.4, 2.7, 2.1, 1.8]


여기서는 동일한 x에 대하여 y1, y2 두 종류의 데이터가 있고 각 데이터마다 에러바 데이터도 각각 존재하는 상태입니다. 데이터 종류가 두 개가 되었다는 것만 제외하면 나머지 표출 방식은 앞서 소개했던 내용과 거의 유사합니다. 일단 막대 형태들만 나타내는 표출을 시도해 본다면 다음과 같이 하면 되며, 그 결과는 다음 그림과 같습니다.


win = WINDOW(DIMENSIONS=[600500])

pl = PLOT(x, y1, XRANGE=[0, 10], YRANGE=[0, 20], LINESTYLE=2, /CURRENT)

plb1 = BARPLOT(x, y1+yerr1, BOTTOM_VALUES=y1-yerr1, NBARS=2, INDEX=0, WIDTH=0.5, $

  FILL_COLOR='green', /OVERPLOT)

plb2 = BARPLOT(x, y2+yerr2, BOTTOM_VALUES=y2-yerr2, NBARS=2, INDEX=1, WIDTH=0.5, $

  FILL_COLOR='orchid', /OVERPLOT)



이와 같이 여러 종류의 에러바들을 나란히 중첩하는 것이 가능한데, ERRORPLOT 함수에서는 기본적으로 지원되지는 않는 기능입니다. 물론 약간의 요령을 사용한다면 ERRORPLOT 함수를 사용해서도 비슷한 표출이 불가능하지는 않겠지요. 하여간 막대외에도데이터 포인트 부분까지 추가한다면 다음과 같이 하면 됩니다. 그리고 그 결과는 다음과 같습니다.


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

pl = PLOT(x, y1, XRANGE=[0, 10], YRANGE=[0, 20], LINESTYLE=2, /CURRENT)

plb1 = BARPLOT(x, y1+yerr1, BOTTOM_VALUES=y1-yerr1, NBARS=2, INDEX=0, WIDTH=0.5, $

  FILL_COLOR='green', /OVERPLOT)

plb1o = BARPLOT(x, y1+0.1, BOTTOM_VALUES=y1-0.1, NBARS=2, INDEX=0, WIDTH=0.5, $

  FILL_COLOR='gold', /OVERPLOT)

plb2 = BARPLOT(x, y2+yerr2, BOTTOM_VALUES=y2-yerr2, NBARS=2, INDEX=1, WIDTH=0.5, $

  FILL_COLOR='orchid', /OVERPLOT)

plb2o = BARPLOT(x, y2+0.1, BOTTOM_VALUES=y2-0.1, NBARS=2, INDEX=1, WIDTH=0.5, $

  FILL_COLOR='gold', /OVERPLOT)



오늘은 에러바(Error Bar)의 표출을 위한 몇가지 방법들을 소개해 보았습니다. IDL에서도 이러한 에러바 표출이 가능하다는 점을 잘활용해보셨으면 합니다.

반응형