plot 프로시저 관련

게시판 IDL Q&A plot 프로시저 관련

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

  • 글쓴이
  • #5635 답변

    kimms
    회원

    PRO READ_ACE

    INPATH_1= ‘D:\Research\ ; ******
    FILE = file_search(INPATH_1+’040201-190830_100km.csv’) ;*******
    nl = FILE_LINES(FILE)
    PRINT, ‘the number of file lines :’, nl

    YEAR = STRARR(nl-6)
    MONTH = STRARR(nl-6)
    DAY = STRARR(nl-6)
    NAME = STRARR(nl-6)

    OPENR, lun, FILE, /GET_LUN
    SS = ”
    FOR i = 0, 5 DO READF, lun, ss
    FOR i = 0, 8 DO BEGIN ;****************
    READF, lun, ss
    spl = STRSPLIT(ss, ‘,’, /EXTRACT, /preserve_null)
    help, spl
    print, spl
    YEAR[i] = string(STRMID(spl[2], 0, 4))
    MONTH[i] = string(STRMID(spl[2], 5, 2))
    DAY[i] = string(STRMID(spl[2], 8, 2))
    NAME[i] = string(spl[0])
    PRINT, NAME
    PRINT, YEAR
    PRINT, MONTH
    ENDFOR
    FREE_LUN, lun

    INPATH_2 = ‘D:\Research\\’
    FOR i = 0, 8 DO BEGIN ;***********************

    FILENAME = file_search(INPATH_2+YEAR(i)+’-‘+MONTH(i)+’\’+ NAME(i)+ ‘v4.0.asc’, count = count)

    IF count EQ 0 THEN BEGIN

    PRINT, ‘NO FILE TO READ’
    ENDIF

    PRINT, ‘————————————–‘
    PRINT, ‘ # of File to read = ‘, count
    print, ‘————————————–‘

    FOR ii = 0, count-1 DO BEGIN
    FILE = FILENAME(ii)
    print, file

    header = STRARR(12)
    fl = FILE_LINES(file)
    print, fl
    nl = fl-12

    Z = FLTARR(nl)
    P = FLTARR(nl)
    CO = FLTARR(nl)
    C2H6 = FLTARR(nl)
    C2H2 = FLTARR(nl)
    HCOOH = FLTARR(nl)
    CH3OH = FLTARR(nl)
    CO2 = FLTARR(nl)

    READCOL, file, Z, P, CO, C2H6, C2H2, HCOOH, CH3OH, CO2, delimiter = ‘ ‘, /preserve_null,$
    format = ‘F,X,X,F,X,X,X,X,X,X,X,F,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,F,X,F,X,X,X,F,X,X,X,X,X,X,X,X,X,F,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,F,X,X’

    ENDFOR ;ii
    ENDFOR ;i
    END

    1번 path에서 YEAR, MONTH, DAY, NAME을 가지고서 path 2에서 file search하여 그해당파일을 열고 그 파일에서 여러가지 변수들을 가지고 왔습니다.

    근데 그다음에 그 변수들을 그 해당파일날짜에 맞게 plot을 해야하는데 아이디어가 안떠올라서 어떻게 해야할지 몰라 이렇게 글을 적습니다.

    • 이 게시글은  kimms에 의해 2 월, 2 주 전에 수정됐습니다.
  • #5637 답변

    kimms
    회원

    정확히 말씀드리면, readcol로 각각 해당하는 날짜에 해당하는 Z, P, CO, C2H6, 등등의 변수가 있는데, 예를들어 19년2월1일 Z와 P, CO, C2H6 등등 plot을 하고, 19년 2월 2일에 Z와 P, Co 등등을 플랏하여 각각 날짜로저장하고싶은데 정확히 모르겠습니다.

  • #5638 답변

    Sangwoo
    회원

    올려주신 질문의 내용만 봐서는 데이터 파일들의 체계를 파악하기가 좀 힘든데요. 아마도 제 추측으로는 전반부의 내용에서 언급된 csv 파일 내에 약 15~16년치의 데이터가 수록되어 있는 것으로 보이고, 후반부에서 언급된 asc 파일들은 년+월에 대하여 나눠진 파일들로 보입니다. 그리고 csv 파일로부터는 년, 월, 일 등 날짜에 해당되는 정보들만 읽어오고, asc 파일로부터는 z, p, co 등의 데이터 값들만 읽어와야하는 상황인지요? 언급하신대로 어떤 파일로부터 z, p, co 등의 데이터를 읽어왔는데 그 데이터들을 년월일 별로 구분하고자 한다면, 데이터와 함께 날짜 정보도 함께 읽어와야 합니다. 그러면 asc 파일 내에도 년월일 등의 정보가 있어야 할 것이고, 그 정보를 읽어와서 년월일 별 배열로 얻은 다음 이 배열에 대해서 WHERE 같은 함수를 써서 원하는 날짜별로 추출을 하는 등의 과정을 거쳐야 할 것으로 보입니다.

    그래서 csv와 asc 파일의 정보들이 총망라된 상태에서 날짜별 추출을 하고자 하는 경우인지, 아니면 asc 파일 각각에 대해서만 그런 추출을 하고자 하는 경우인지 궁금합니다. 주신 정보만으로는 저로서도 더 이상 자세한 도움을 드리기는 힘들 것 같습니다.

    • #5640 답변

      kimms
      회원

      일단 csv 파일의 배열은

      ================================================================
      SUNSKY
      Compiled on: 2019-08-28
      Occurring between: 2004-02-1 and 2019-08-30
      Located within: 100 kilometers

      name type datetime
      32001 sun 2004-03-17 04:14:09.17+00
      12938 sun 2005-10-31 00:56:50.98+00
      13489 sun 2006-03-19 04:33:31.6+00
      22296 sun 2007-10-24 01:48:04.94+00
      28150 sun 2008-10-28 01:14:56.11+00
      46163 sun 2012-03-23 04:55:41.43+00
      59867 sun 2013-10-20 18:28:15.48+00
      89144 sun 2019-02-21 02:31:18.92+00
      84123 sun 2019-03-24 04:43:49.48+00
      ================================================================
      총 15줄 (의미없는줄 6줄, 데이터줄 9줄)

      asc파일의 배열은

      ================================================================
      name | 35216
      start_timetag | 1320805039
      end_timetag | 1320805235
      start_time | 2010-04-01 02:17:19+00:00
      end_time | 2010-04-01 02:20:35+00:00
      date | 2010-04-01 02:17:54.400000+00:00
      latitude | 22.88
      longitude | 12.13
      beta_angle | -12.48

      z T T_fit P (atm) dens H2O H2O_err ….
      0.5 293.00 0 0.100E+01 0.250E+20 -0.999E+03 -0.999E+03 ….
      1.5 293.00 0 0.100E+01 0.250E+20 -0.999E+03 -0.999E+03 ….
      2.5 293.00 0 0.100E+01 0.250E+20 -0.999E+03 -0.999E+03 ….
      . . . . . . . .
      . . . . . . . .
      . . . . . . . .
      . . . . . . . .
      ======================================================================
      총 162줄 (의미없는 데이터 12줄, 데이터줄 150줄),

      일단 자세히 설명을 다시 드리면, 위의 csv파일에서 name이라고 되어있는 이름들을 제가 가지고 있는 asc파일들에서 찾았습니다. 그래서 9개의asc 파일을 2번째경로에서 읽었고, readcol을 이용해서 제가 필요한 변수(Z, P, T ..등등)을 찾아서 배열로 지정을 하였습니다. print를 하니 각각의 변수읽은것을 확인하였습니다.

      그래서 그 다음에 제가 그리고 싶은 plot은
      각각의 9개 asc파일로부터 읽은 Z, P, T, 등을 예를들어 x축은 T, y축은 P라고 하고 각각 9개의 window 프로시저를 사용하여 플랏하는 것입니다.

      for문을 이용하려고 해봣는데 계속 오류가 나서 글올려봅닌다

    • #5641 답변

      Sangwoo
      회원

      우선 오류가 난다고 하셨는데 구체적인 증상이 무엇인지를 알려주셔야 합니다. 그냥 오류가 난다는 말씀만 하시면 답변 드리는 입장에서는 도와드리가 매우 어렵습니다.

      일단 처음에 올리셨던 코드와 나중에 추가하신 내용을 참조해서 나름 답을 드린다면, 두번째 파트의 반복구문 내에 다음과 같은 내용이 있는데요.

      IF count EQ 0 THEN BEGIN
      PRINT, ‘NO FILE TO READ’
      ENDIF

      아마도 해당되는 asc 파일이 하나도 없을 경우를 위하여 삽입된 내용으로 보입니다. 그런데 이렇게만 해두면 count의 값이 0일 경우 읽을 파일이 없다는 메시지는 출력하지만 그 상태로 반복구문 내의 작업은 계속 진행될 수 밖에 없습니다. 그러면 이후에 등장하는 ii를 사용하는 반복문이 제대로 실행될 수 없고 오류가 발생하게 됩니다. 이러한 문제를 방지하려면 위의 IF문을 다음과 같이 바꾸는게 좋습니다.

      IF count EQ 0 THEN BEGIN
      PRINT, ‘NO FILE TO READ’
      CONTINUE
      ENDIF

      이렇게 하면 count가 0일 경우에는 메시지를 일단 출력한 뒤 반복문의 다음 회차로 바로 건너뛰게 됩니다. 그렇게 해야 해당 asc 파일이 전혀 없을 경우에 다음 회차로 알아서 넘어가도록 하는 것이 가능합니다. 그리고 그 뒷부분을 보면 READCOL 명령이 사용된 부분이 다음과 같이 나와있는데요.

      Z = FLTARR(nl)
      P = FLTARR(nl)
      CO = FLTARR(nl)
      C2H6 = FLTARR(nl)
      C2H2 = FLTARR(nl)
      HCOOH = FLTARR(nl)
      CH3OH = FLTARR(nl)
      CO2 = FLTARR(nl)
      READCOL, file, Z, P, CO, C2H6, C2H2, HCOOH, CH3OH, CO2, ~~~~

      여기서는 Z, P, CO 등과 같은 배열의 형태를 미리 규정한 다음에 READCOL을 사용할 필요는 없습니다. 어차피 READCOL 명령의 실행 과정에서 파일 내의 값들을 하나하나 읽어가면서 각 배열마다 값을 채워넣기 때문에, READCOL 명령이 실행된 후에 Z, P, CO 등의 배열들이 생성됩니다. 그래서 여기서는 그냥 다음과 같이 READCOL 명령만 바로 사용하면 됩니다.

      READCOL, file, Z, P, CO, C2H6, C2H2, HCOOH, CH3OH, CO2, ~~~~

      물론 원래 하셨던대로 한다고 해서 오류가 나거나 하지는 않지만, 굳이 필요없는 여러 줄의 라인들은 제거하여 코드의 내용을 조금이라도 단순화시키는 것이 좋습니다.

      그리고 질문하시는 내용과 관련하여 전체적으로 말씀을 드리고 싶은데요. 처음에 올리셨던 질문의 내용을 보면, 제가 보기에는 데이터 처리 작업을 위한 전반적인 아이디어에 대한 문의의 성격이 강한 것으로 보입니다. 그런데 이렇게 되면 Q&A 게시판에서 질문과 답으로 주고받기에는 너무 광범위한 문제입니다. 작업을 구체적으로 진행하면서 마주하게 되는 구체적인 이슈에 대해서라면 Q&A 게시판에서 소화가 가능하겠지만, 그냥 전반적인 아이디어를 얻고자하는 경우는 Q&A가 아닌 컨설팅의 영역에 가깝습니다. 따라서 좀 더 범위를 좁혀서 구체적인 이슈에 관한 질문으로 해주시면 답을 드리는 입장에서도 더 명확하고 구체적인 도움을 드릴 수 있다는 점을 염두에 둬주시면 감사하겠습니다.

      • 이 답변은  Sangwoo에 의해 2 월, 1 주 전에 수정됐습니다.
      • 이 답변은  Sangwoo에 의해 2 월, 1 주 전에 수정됐습니다.
'plot 프로시저 관련'에 답변달기
글쓴이 정보: