for 작업할때 동일 창에 plot 띄우기 및 저장

게시판 IDL Q&A for 작업할때 동일 창에 plot 띄우기 및 저장

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

  • 글쓴이
  • #5448

    woonghyun
    회원

    안녕하세요. for을 이용한 반복 작업을 코딩하고 있고, window를 이용해서 여러 창을 띄어서 결과물을 실행하고 있습니다.
    for i=0, 18 do begin
    ……
    win1 = window(dimensions = [400,400])
    plo4 = plot3d(…..,/current)
    plo5 = plot3d(…..,/overplot)
    ……
    win2 = window(dimensions = [900,400],layout=[2,1])
    plo6 = plot(……,/current,layout=[2,1,1])
    plo7 = barplot(……,/current,layout=[2,1,2])
    ……
    cursor,d1,d2,3
    if !mouse.button ne 1 then stop
    endfor

    먼저 plot3d와 plot을 layout을 이용해서 하나의 창에 모두 출력하려고 했는데(layout=[3,1]로 하고 [3,1,1]에 plot3d, [3,1,2]에 plot, [3,1,3]에 barplot) 그래프가 겹쳐서 나와서(한 가운데 plot3d의 결과가 있고 plot과 barplot은 layout에 따라 출력됩니다.) 별도의 창으로 분류했습니다. 겹치지 않고 하나의 창에 띄우는 방법은 없는걸까요 ?
    또한 위와 같이 cursor를 이용해서 다음 순서로 넘어가는데, plot이 출력된 창과는 다른 별도의 검은 창(아무것도 없습니다.) 이 뜨고 이 창 내에서 클릭을 해야만 다음 순서로 넘어갑니다. plot이 전시되어 있는 창을 눌렀을 때 넘어가게 하면서, 새 창이 뜨지 않고 기존의 창에서 내용만 바뀌게 하는 방법은 없을까요? 검은창이 있어서 tvrd를 이용해서 화면을 캡처하려고 해도 검은 화면이 캡처되서 저장할 수가 없습니다.

  • #5450

    jhlee
    Keymaster

    우선 하나의 window에 layout 을 설정하여 3개를 한번에 표출하는 것은 제 컴퓨터에서는 정상 작동을 합니다. 아래 내용으로 테스트 해보시길 부탁드리며, 그래도 겹쳐서 표출이 된다면 IDL 버전, 사용하시는 컴퓨터 OS 정보를 공유해주시면 감사하겠습니다.
    w1 = window(dimensions = [900,400])
    p1 = plot3d(/test, /CURRENT, layout=[3,1,1])
    p2 = plot(/test, /current,layout=[3,1,2])
    p3 = barplot(/test, /current,layout=[3,1,3])

    그리고 new graphics와 direct graphics을 혼용하고 계신 것 같은데요, window 함수를 사용하신 것은 new graphics문법입니다. cursor는 direct graphics에서 작동하며 new graphics에서의 이벤트 생성에 대해서는 아래 문서를 참고해주십시오.
    http://www.idl-envi.co.kr/callcenter/tips/file/61_1378456651.pdf

    새창 생성말고 현재 창에서 반복 작업을 위해서는 단순히 window 함수를 for문 위에 배치시키면 될 것 같고,
    window 함수를 이용하여 작업을 하신다면 tvrd가 아닌 save 매서드를 이용하시는게 좋을 것 같습니다.
    위의 문법 마지막에
    w1.save, ‘save_test.png’
    정도만으로 캡쳐 및 저장이 가능함을 확인하실 수 있습니다.

    • #5451

      woonghyun
      회원

      답변 감사드립니다. 추가로 질문이 있는데요. for 구문 위에 window를 사용해서 하나의 창에서 작업하는 것은 수정하였으며, for 구문의 마지막에 w.erase를 넣어서 다음 i번째에서 그래프가 중복 전시되는 걸 막는 것까지는 했지만, 마우스 버튼을 눌러야 다음 i번째로 진행되게 할 수는 없을까요? 현재는 그냥 계속 순서대로 데이터를 처리하고 있는데 이를 마우스 클릭이 있어야만 다음으로 넘어가게 만들고 싶습니다. 또한 i가 대략 200여개 정도 되는데 for 구문동안 출력되는 모든 그래프를 개별적으로 저장하고 싶습니다. 말씀하신 것처럼 w1.save, ‘파일이름’으로 코딩하면 for에서 가장 마지막 파일만 저장이 됩니다.

  • #5452

    Sangwoo
    회원

    NG 기반의 그래픽창에서 마우스 클릭에 의하여 약속된 작업이 진행되도록 하려면, 마우스 클릭을 이벤트로 인식하여 그 정보를 관련 서브루틴에 전달하여 작업이 처리되도록 코딩이 되어야 합니다. 그렇게 코딩을 하는 방법이 위의 댓글에서 링크로 언급된 PDF 문서에 있습니다. 이 문서의 내용을 일단 한번 읽어보시길 권합니다. 그리고 이와 관련해서 IDL 도움말의 검색창에서 “Creating Mouse Event Functions”라는 문구로 검색을 하면 나오는 내용이 있는데 이 내용도 참조하는 것이 좋습니다. 사실 이러한 방향의 코딩은 약간 까다로울 수 있기 때문에 관련 내용에 대한 이해가 필수입니다.

    그리고 그림 저장에 있어서 그림파일의 이름이 고정되면 200회 반복해서 저장 작업이 진행되더라도 같은 이름의 파일로 계속 덮어쓰기 때문에 당연히 맨 마지막 회차의 그림만 저장된 것처럼 보일 수 밖에 없습니다. 매 회차마다 파일의 이름이 달라지도록 하려면 STRING 함수같은 것을 사용하여 파일 이름이 될 문자값이 매 회차마다 변화하도록 처리해야 합니다. 만약에 예를 들어 200회에 걸친 반복 과정에서 매 회차에 해당되는 숫자 i가 파일명에 반영되도록 하는 경우라면 그림 저장 단계에서 STRING 함수를 다음과 같이 활용하는 방법을 생각해볼 수도 있습니다.

    filename = ‘save_test_’+STRING(i, FORMAT='(I3.3)’)+’.png’
    w1.Save, filename

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