CONTOUR 색칠 관련 문의

게시판 IDL Q&A CONTOUR 색칠 관련 문의

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

  • 글쓴이
  • #5181

    ChoiYoun
    회원

    안녕하세요. CONTOUR 함수가 제대로 색칠을 못해서 문의드리고자 글 남깁니다.

    아래는 예시코드 입니다.

    예시코드를 실행했을 때, CONTOUR가 제대로 색칠을 못하는 것을 확인할 수 있습니다.

    자료를 지도투영법에 적용하지 않았을 경우(즉, OVERPLOT = m 키워드가 없을 경우) CONTOUR가 정상적으로 색칠하는 것을 확인하였습니다.

    이럴 경우 CONTOUR가 모든 영역을 칠하게 하고 싶으면 어떻게 해야할까요.

    data = [[2,2,3,2,1,3,6,5,2,6,6,6,3,2,2,3,0,4,3,2,2,4,13], $
    [2,1,2,0,4,3,7,0,1,8,5,5,5,4,7,3,5,3,4,3,1,3,0], $
    [3,2,10,0,5,0,2,0,2,2,8,9,7,5,3,6,2,0,0,5,1,11,2], $
    [3,1,6,0,9,8,0,3,0,7,4,4,4,3,5,3,2,1,3,6,12,5,0], $
    [1,5,3,2,5,0,0,0,1,0,8,2,3,1,4,3,5,4,1,4,10,0,3], $
    [0,0,2,0,3,7,9,2,6,4,3,6,1,3,5,5,7,2,0,8,2,0,1], $
    [0,1,1,0,1,6,0,4,0,0,0,8,2,1,4,2,5,0,2,3,3,4,0], $
    [0,0,4,3,4,0,0,2,0,0,3,1,4,3,3,5,6,0,3,3,3,1,2], $
    [0,4,1,1,1,0,2,1,3,1,0,3,1,4,2,13,7,3,9,3,5,2,1], $
    [0,0,0,10,2,1,9,0,3,5,5,4,5,5,0,14,2,2,2,4,3,5,0], $
    [4,4,0,9,1,3,2,3,4,1,6,4,4,0,0,2,2,4,4,6,3,4,0], $
    [9,0,2,8,5,6,7,5,3,1,3,1,7,4,3,2,0,5,4,3,4,0,0], $
    [2,2,1,3,3,7,5,8,3,2,1,4,5,18,11,5,0,2,3,4,3,0,0], $
    [0,5,3,2,4,4,2,9,3,3,5,3,5,11,5,5,1,1,2,0,2,0,0], $
    [0,4,4,5,0,5,2,4,3,7,2,3,5,6,1,5,4,4,4,1,1,0,0], $
    [3,0,3,3,3,5,2,2,6,4,0,6,4,2,0,2,6,4,1,5,2,0,0], $
    [6,7,3,1,3,7,1,4,4,7,2,0,14,0,2,8,5,0,2,9,0,0,0], $
    [3,5,3,5,6,4,0,0,3,6,6,6,0,3,0,4,5,0,0,1,0,0,0], $
    [0,3,4,2,3,6,5,4,5,7,4,4,0,5,9,1,4,0,2,1,0,0,0], $
    [1,0,7,3,4,6,2,5,6,9,8,4,3,3,12,0,3,3,13,0,0,0,0], $
    [0,0,0,0,0,4,4,4,7,2,6,9,3,0,0,0,0,0,0,0,0,0,0], $
    [5,0,3,5,6,0,4,4,4,4,4,3,0,0,0,0,0,0,0,7,4,0,0], $
    [2,2,1,2,5,11,0,5,2,19,3,0,0,0,4,1,2,4,7,13,4,3,0]]

    xx = [106.71916, 106.71999, 106.72083, 106.72166, 106.72249, $
    106.72333, 106.72416, 106.72499, 106.72583, 106.72666, $
    106.72749, 106.72833, 106.72916, 106.72999, 106.73083, $
    106.73166, 106.73249, 106.73333, 106.73416, 106.73499, $
    106.73583, 106.73666, 106.73749]
    yy = [ 10.64962, 10.65045, 10.65128, 10.65212, 10.65295, $
    10.65378, 10.65462, 10.65545, 10.65628, 10.65712, $
    10.65795, 10.65878, 10.65962, 10.66045, 10.66128, $
    10.66212, 10.66295, 10.66378, 10.66462, 10.66545, $
    10.66628, 10.66712, 10.66795]

    limit = [MIN(yy), MIN(xx), MAX(yy), MAX(xx)]
    m = MAP(‘Lambert Conformal Conic’, STANDARD_PAR1 = 30, STANDARD_PAR2 = 60, $
    LIMIT = limit, /NODATA)

    c_value = [-999, 0, 50, 100, 150, 200, 300, 400, 600, 800, 1000, 1200, 2000]
    r = INDGEN(N_ELEMENTS(c_value)) &g = r &b = r
    r[0:12] = [150, 76,121,151,202,195,245,191,241,243,246,249,255]
    g[0:12] = [190,126,203,255,202,150,187, 98,123,155,188,221,255]
    b[0:12] = [255, 23, 37, 46, 40, 33, 41,103,125,128,129,132,255]
    rgb = [[r], [g], [b]]
    rgb = TRANSPOSE(rgb)

    c = CONTOUR(data, xx, yy, GRID_UNITS=’degrees’, $
    C_VALUE = c_value, C_COLOR = rgb, /FILL, OVERPLOT = m)

    • 이 게시글은  ChoiYoun에 의해 6 월, 3 주 전에 수정됐습니다.
  • #5184

    Sangwoo
    회원

    올려주신 코드를 테스트해본 결과, 말씀하신대로 색상이 채워진 일부분이 깨진 것과 같은 현상을 발견하였습니다. 특히나 대상 데이터가 23×23으로 격자수가 많지 않은 경우라서 더 두드러져 보이는 것 같습니다. 이 문제는 제가 본사에 문의해본 결과 CONTOUR 함수의 FILL 기능에 존재하는 버그임이 확인되었습니다. 하지만 버그의 수정은 본사에서 하는 것이므로, 이 문제가 정확히 언제쯤 수정이 될지에 대해서는 현재로서는 확실하게 말씀드릴 수 없는 점 이해 부탁드립니다.

    그래서 완벽하지는 않더라도 뭔가 우회적인 방법을 고민해본 결과 다음과 같은 방법을 제시해 드립니다. 이 방법은 기본적으로 어떤 것이냐 하면, 지도투영법을 적용하지 않아서 정상적으로 색상이 채워지는 contour를 별도의 그래픽창에 표출하여 이 내용을 이미지의 형태로 캡쳐한 후 본래의 contour에 중첩하는 방법입니다. 먼저 캡쳐를 위한 contour를 다음과 같이 별도의 그래픽창에 표출한 후 캡쳐합니다.

    win0 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR, BUFFER=1)
    con0 = CONTOUR(data, xx, yy, C_VALUE=cval, C_COLOR=cclr, $
    C_LABEL_SHOW=0, FILL=1, AXIS_STYLE=0, $
    XRANGE=[limit[1], limit[3]], YRANGE=[limit[0], limit[2]], $
    MARGIN=0, /CURRENT)
    con_cap = win0.CopyWindow()

    이렇게 하여 얻어진 con_cap은 캡쳐된 이미지 데이터입니다. 그리고 위의 내용에서 WINDOW 함수의 BUFFER 키워드의 값이 1로 되어 있는데, 이렇게 하면 그래픽창이 뜨지 않고 작업이 진행됩니다. 물론 이 값을 0으로 하면 그래픽창이 뜨게 되므로, 캡쳐될 contour 그림이 어떻게 캡쳐가 되는가를 볼 수 있습니다. 이와 같이 캡쳐 이미지를 생성한 후 본래의 contour에 이미지의 형태로 다음과 같이 중첩 표출하면 됩니다.

    win1 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
    m1 = MAP(‘Lambert Conformal Conic’, LIMIT=limit, $
    STANDARD_PAR1=30, STANDARD_PAR2=60, $
    ASPECT_RATIO=0, MARGIN=[0.15, 0.20, 0.05, 0.05], /CURRENT)
    im1 = IMAGE(con_cap, GRID_UNITS=2, INTERPOLATE=1, $
    IMAGE_LOCATION=[limit[1], limit[0]], $
    IMAGE_DIMENSION=[limit[3]-limit[1], limit[2]-limit[0]], $
    ASPECT_RATIO=0, /OVERPLOT)
    mc1 = MAPCONTINENTS(THICK=2)
    m1.MapGrid.LABEL_POSITION = 0

    직접적인 방법이 아닌 우회적인 방법이라는 점이 안타깝긴 하지만, 일단 이러한 방식으로라도 원하시는 그림을 얻으실 수 있으면 합니다.

  • #5187

    ChoiYoun
    회원

    언제나 정성스러운 답변 감사드립니다. 항상 많은 도움을 받고 있습니다. 정말 큰 도움이 되었습니다.

답변은 로그인 후 가능합니다.