벡터 범례 문의(2)

게시판 IDL Q&A 벡터 범례 문의(2)

이 게시글은 2개 답변과 2명 참여가 있으며 마지막으로  ChoiYoun에 의해 2 월, 2 주 전에 업데이트 됐습니다.

  • 글쓴이
  • #5476 답변

    ChoiYoun
    회원

    안녕하세요. 항상 많은 도움을 받고 있습니다. 지난 번에 벡터의 범례를 그릴 때 크기 및 위치가 계속 변경되어 문의글을 올렸었는데요.

    답변해주신 LENGTH_SCALE 변수를 이용해 이를 해결할 수 있다고 생각하여 본 프로그램에 적용하였으나, 예제 프로그램과 달리 여전히 동일한 문제가 발생하였습니다.

    그래서 해당 문제를 재현할 수 있는 예제 코드를 만들던 와중 아래 두 가지 조건이 동시에 만족할 때 발생하는 문제라는 걸 확인하였습니다.

    1) 비등방형 자료
    2) MAP 위에 표출

    아래는 문제가 발생하는 예시 코드입니다.

    ;[MAP + Anisotropic (x,y)]=====================

    ;For Anisotropic (x,y)
    sb = 32 &wb = 123 &nb = 41 &eb = 132
    xx_1d = FLTARR(10, 10)
    yy_1d = FLTARR(10, 10)
    fix_seed = 1
    for iy = 0, 9 do xx_1d[*, iy] = wb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    for ix = 0, 9 do yy_1d[ix, *] = sb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    xx_1d = REFORM(xx_1d, 100)
    yy_1d = REFORM(yy_1d, 100)

    ;Map set
    m = MAP(‘Geographic’, LIMIT = [sb,wb,nb,eb], $
    ASPECT_RATIO = 0, CENTER_LONGITUDE = 128, BUFFER = 1)
    mc_ = MAPCONTINENTS()
    FOR i = 0, 9 DO BEGIN
    uu = 10*RANDOMN(seed, 10, 10)
    vv = 10*RANDOMN(seed, 10, 10)
    uu_1d = REFORM(uu, 100)
    vv_1d = REFORM(vv, 100)
    spd = SQRT(uu_1d^2+vv_1d^2)
    scl = MAX(spd)/60.*3
    v = VECTOR(uu_1d, vv_1d, xx_1d, yy_1d, MIN_VALUE=0, MAX_VALUE=60, $
    LENGTH_SCALE=scl, HEAD_SIZE=scl/2, /OVERPLOT)
    v_legend = LEGEND(TARGET=v, SAMPLE_MAGNITUDE=10, UNITS=’$m s^{-1}$’)
    v_legend.POSITION = [0.95, 0.975]
    v.Save, STRING(STRING(i), FORMAT = ‘(I0)’) + ‘.png’
    IF i NE 9 THEN v.delete
    ENDFOR
    ;============================================

    고견 부탁드립니다.

  • #5477 답변

    mwkim
    회원

    안녕하세요, 해당 부분에 대해서는 정확하게 확인된 것은 아닌데 아래 내용을 확인해주시면 감사하겠습니다.

    올려주신 예재를 실행했을 때, 실제 레전드에서 표출되는 크기가 변동되는 것을 확인했습니다.
    (사실상 레전드가 달라지기 보다는 벡터 표출의 기준 크기가 달라진다고 보는게 맞습니다.)

    해당 부분에서 특이한 것은 표출 시 표출이 되지 않는 위치가 있다는 것입니다.

    올려주신 예제에서 xx_1d와 yy_1d의 경우 fix_seed를 1로 하여 위치를 고정했기 때문에 아마 동일하게 확인될텐데

    경계 부분에서 일부 값이 표출되지 않는 것을 확인할 수 있습니다.

    문제가 발생하는 부분이 이 부분이 아닐까 합니다.

    앞서 알려드렸듯이 벡터의 크기 조절은 내장 함수에서 표출하고자 하는 벡터의 크기를 기준으로 정하게 되는데,

    이 표출되지 않는 지점에서 MAX(spd)값이 발생하는 경우,

    실제 vector 표출의 크기 조정에 사용되는 최대 크기와 해당 값이 다르기 때문에 발생한다고 보여집니다.
    (위에서 언급한 바와 같이 확실히 확인 된 것은 아닙니다.)

    이를 위해 표출 범위를 넓혀서 표출하면 우선 해당 문제가 해결된 것처럼 보여서 확인해보시면 될 것 같습니다.

    참고로 아래는 올려주신 코드를 변형하여 테스트한 코드입니다.
    (wideRange 옵션으로 표출 범위 조정)

    PRO TEST_LEGEND2

    ;[MAP + Anisotropic (x,y)]=====================

    ;For Anisotropic (x,y)
    ;
    wideRange = 0 ; 1로 설정하면 표출 범위가 넓어집니다.
    ;
    xx_1d = FLTARR(10, 10)
    yy_1d = FLTARR(10, 10)
    fix_seed = 1
    if widerange eq 0 then begin
    sb = 32. &wb = 123. &nb = 41. &eb = 132.
    for iy = 0, 9 do xx_1d[*, iy] = wb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    for ix = 0, 9 do yy_1d[ix, *] = sb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    endif else begin
    sb = 31. &wb = 122. &nb = 42. &eb = 133.
    for iy = 0, 9 do xx_1d[*, iy] = wb + 1. + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    for ix = 0, 9 do yy_1d[ix, *] = sb + 1. + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    endelse

    ;Map set
    fix_seed2 = 2 ; 풍속도 랜덤으로 하면 문제 발생할 때 까지 반복해야 해서 이 부분도 고정했습니다.
    m = MAP(‘Geographic’, LIMIT = [sb,wb,nb,eb], $
    ASPECT_RATIO = 0, CENTER_LONGITUDE = 128)
    mc_ = MAPCONTINENTS()
    FOR i = 0, 9 DO BEGIN
    uu = 10*RANDOMN(fix_seed2, 10, 10)
    vv = 10*RANDOMN(fix_seed2, 10, 10)
    uu_1d = REFORM(uu, 100)
    vv_1d = REFORM(vv, 100)
    spd = SQRT(uu_1d^2+vv_1d^2)
    scl = MAX(spd)/60.*3
    v = VECTOR(uu_1d, vv_1d, xx_1d, yy_1d, $;MIN_VALUE=0, MAX_VALUE=60, $
    LENGTH_SCALE=scl, HEAD_SIZE=scl/2, /OVERPLOT)
    v_legend = LEGEND(TARGET=v, SAMPLE_MAGNITUDE=10, UNITS=’$m s^{-1}$’)
    v_legend.POSITION = [0.95, 0.975-i*0.1] ; 겹쳐져서 그려지지 않게 하기 위해 변경하였습니다.
    ENDFOR
    pline = POLYLINE([535,535],[10,500],COLOR=’r’,/DEVICE) ; 동일한 위치인지 확인하려고 선을 그었습니다.
    pline = POLYLINE([515,515],[10,500],COLOR=’r’,/DEVICE) ;

    ;============================================
    ;
    END

    • 이 답변은  mwkim에 의해 2 월, 3 주 전에 수정됐습니다.
    • 이 답변은  mwkim에 의해 2 월, 3 주 전에 수정됐습니다.
    • 이 답변은  mwkim에 의해 2 월, 3 주 전에 수정됐습니다.
    • 이 답변은  mwkim에 의해 2 월, 3 주 전에 수정됐습니다.
    • 이 답변은  mwkim에 의해 2 월, 3 주 전에 수정됐습니다.
  • #5494 답변

    ChoiYoun
    회원

    답변 감사합니다.

    말씀해주신 것처럼 문제의 원인은 MAP에 벡터가 모두 나오지 않을 경우 발생하는 문제였습니다.
    (이는 본 프로그램에도 적용하여 확인)

    하여 아래와 같은 과정을 거쳐 벡터의 XY지점을 MAP 범위와 동일하게 만들어 해결하였습니다.

    ;Make anisotropic(x, y)
    sb = 32 &wb = 123 &nb = 41 &eb = 132
    xx_1d = FLTARR(10, 10)
    yy_1d = FLTARR(10, 10)
    fix_seed = 1
    for iy = 0, 9 do xx_1d[*, iy] = wb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    for ix = 0, 9 do yy_1d[ix, *] = sb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    xx_1d = REFORM(xx_1d, 100)
    yy_1d = REFORM(yy_1d, 100)

    ;Select limited area
    wh_xx = WHERE(xx_1d gt wb and xx_1d lt eb)
    wh_yy = WHERE(yy_1d gt sb and yy_1d lt nb)
    match, wh_xx, wh_yy, sub_xx, sub_yy ;Need astron library
    wh_limit = wh_xx[sub_xx]
    xx_limit = xx_1d[wh_limit]
    yy_limit = yy_1d[wh_limit]

    ;Map set
    fix_seed2 = 2
    m = MAP(‘Geographic’, LIMIT = [sb,wb,nb,eb], $
    ASPECT_RATIO = 0, CENTER_LONGITUDE = 128, BUFFER = 1)
    mc_ = MAPCONTINENTS()

    FOR i = 0, 9 DO BEGIN
    uu = 10*RANDOMN(fix_seed2, 10, 10)
    vv = 10*RANDOMN(fix_seed2, 10, 10)
    uu_1d = REFORM(uu, 100)
    vv_1d = REFORM(vv, 100)

    uu_limit = uu_1d[wh_limit]
    vv_limit = vv_1d[wh_limit]

    spd = SQRT(uu_limit^2+vv_limit^2)
    scl = MAX(spd)/60.*3
    v = VECTOR(uu_limit, vv_limit, xx_limit, yy_limit, MIN_VALUE=0, MAX_VALUE=60, $
    LENGTH_SCALE=scl, HEAD_SIZE=scl/2, /OVERPLOT)

    v_legend = LEGEND(TARGET=v, SAMPLE_MAGNITUDE=10, UNITS=’$m s^{-1}$’)
    v_legend.POSITION = [0.95, 0.975]

    v.Save, ‘./OUTPUT/’ + STRING(STRING(i), FORMAT = ‘(I0)’) + ‘_21.png’
    IF i NE 9 THEN v.delete
    ENDFOR

    정말 많은 도움이 되었습니다. 다시 한번 감사드립니다.

'벡터 범례 문의(2)'에 답변달기
글쓴이 정보: