티스토리 뷰




일반적으로 DIAdem에서 추가하는 그래프는 X축이 시간축이 데이터를 많이 봅니다. 하지만 XY그래프를 통해서 X축과 Y축의 상관관계를 볼수도 있습니다. 번글에서는 DIAdem에서 XYGraph를 생성하는 방법에 대해서 알아보도록 하겠습니다. 


1. DIAdem 리포트에서 2D 그래프를 하나 추가합니다. 아래의 그림처럼 사용자는 그래프 추가가 가능합니다. 



2. 그래프를 만들었으면, 그래프에 데이터를 추가해야합니다. X축, Y축에 데이터를 넣어야 하므로, 2개의 데이터를 선택합니다. DIAdem의 특징은 먼저 선택된 그룹의 채널이 X축에 들어갑니다. 따라서 아래의 그림을 예제로 본다면 Wind_1_5를 먼저 선택을 하고, Ctrl을 누른상태에서 Wind_10을 선택을 합니다. 선택한 데이터를 그래프로 Drag And Drop 합니다. 



3. 자료를 옮기면 아래와 같은 결과를 확인할 수 있습니다. 현재의 그래프는 Line을 이어주는 방식으로 데이터를 표시하기 때문에 XY그래프를 보기위한 방법으로 적합하지 않습니다.



4. 위의 그래프 방식을 변경해 보도록 하겠습니다. 그래프에서 오른쪽 마우스 버튼을 눌러 Diaplay를 선택합니다. 



5. 그래프의 타입을 변경하기 위해 Curve List에서 Type을 선택합니다. 



6. Line 타입으로 지정되어있는 Display Mode를 Line and Points로 변경하고, Line Color를 No Color로 설정을 합니다. 



7. Label Tab으로 이동을 하여 Free Text 부분에 *를 입력합니다. *를 입력하는 것은 X축에 대한 Y축의 값을 표현하기 위한 방법입니다. 다른 Character를 입력해도 무방합니다. 



8. OK 버튼을 누르면 이전의 그래프 모양과는 다르게, *로 이루어진 XY 그래프가 만들어 진것을 확인할 수 있습니다. 



XY 그래프를 완성하였습니다. 



추가적으로 위의 XY 그래프를 이용하여, 각 X축에 있는 Y의 값들을 더하여 X축의 값에 대한 Y의 평균값을 구하는 방법에 대해서 알아보도록 하겠습니다. DIAdem에서는 안타깝게도, XY그래프에서 대한 Y의 값을 평균화하는 함수를 제공하고 있지 않습니다. 이럴 경우에 DIAdem Script를 이용하여 직접 함수를 구현해야 합니다. 


구현된 코드를 먼저 확인을 하고, 코드 리뷰를 진행하도록 하겠습니다.


' X축에 대해 중복되는 Y축의 값을 합해서 평균을 구하기 위한 dictionary 사용

Dim dictionay, numberOfDictionary

Set dictionay = CreateObject("Scripting.Dictionary")

Set numberOfDictionary = CreateObject("Scripting.Dictionary")


' XY 그래프에서 처리하고 있는 데이터 관련 채널 

dim xChannel, yChannel

set xChannel = Data.Root.ActiveChannelGroup.Channels.Item(1)

set yChannel = Data.Root.ActiveChannelGroup.Channels.Item(2)


' 결과 채널이 존재한다면 채널을 삭제

if Data.Root.ActiveChannelGroup.Channels.Exists("AveragedXChannel") then

  Data.Root.ActiveChannelGroup.Channels.Remove("AveragedXChannel")

  Data.Root.ActiveChannelGroup.Channels.Remove("AveragedYChannel")

end if


' 결과를 저장할 채널 생성

Call Data.Root.ActiveChannelGroup.Channels.Add("AveragedXChannel",DataTypeChnFloat64)

Call Data.Root.ActiveChannelGroup.Channels.Add("AveragedYChannel",DataTypeChnFloat64)


dim xIndex

dim xValue, yValue


' index에 따른 x축과 y축의 값을 가져오기

for xIndex = 1 to xChannel.Size

  xValue = xChannel.Values(xIndex)  

  yValue = yChannel.Values(xIndex)

  

' dictionary에 x축의 값이 존재하면 그 값에 현재 index의 xValue를 더하고, 아니면 새로운 dictionary에 추가

  if dictionay.Exists(xValue) then  

    dictionay.Item(xValue) = dictionay.Item(xValue) + xValue  

    numberOfDictionary(xValue) = numberOfDictionary(xValue) + 1

  else

    call dictionay.Add(xValue, yValue)

    numberOfDictionary(xValue) = 1

  end if

next 


' X축을 기준으로 Sort, Sort하는 이유는 xy 그래프의 X축 기준에 맞게 데이터를 나열시키기 위함입니다.

dim outputLines, sElement

Set outputLines = CreateObject("System.Collections.ArrayList")

for each sElement in dictionay.Keys

  outputLines.Add(sElement)

next

outputLines.sort()


dim arrayXChannel()

redim arrayXChannel(1, dictionay.Count)



' 평균값을 가진 채널 생성하기

dim newYValue, newIndex

newIndex = 1

for each sElement in outputLines

  newYValue = dictionay.Item(sElement) / numberOfDictionary(sElement)

  arrayXChannel(0, newIndex) = sElement

  arrayXChannel(1, newIndex) = newYValue

  newIndex = newIndex + 1

next


Dim MyChannels(1)

MyChannels(0) = "AveragedXChannel"

MyChannels(1) = "AveragedYChannel"


' 생성한 채널값을 AveragedXChannel과 AveragedYChannel에 넣기

Call ArrayToChannels(arrayXChannel, MyChannels)


코드의 주석을 보면 확인할 수 있지만, 평균을 구하기 위해서 Dictionary를 사용하였습니다. Dictionary는 해시테이블을 기반으로 하는 자료구조입니다. 아래의 그림처럼 특징 Key에 연결되는 데이터를 저장할 수 있는 자료구조입니다. 



X축의 값에 따라서 값을 Dictionary에 넣습니다. Dictionary의 Key는 X축의 값이, Y축의 값은 Buket에 들어가게 됩니다. 모든 값을 넣고, Key에 대한 횟수로 나누어 평균을 구합니다. 평균을 구한뒤에 평균에 대한 결과를 새로운 채널로 만드는 알고리즘입니다.


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.


댓글