Gnuplot을 이용하여 숫자 데이터를 시각화 (python)

  • 최초 작성일: 2022년 1월 12일 (수)

목차

[TOC]


목표

아래의 이미지와 같은 무분별한 숫자를 나열한 log 혹은 txt 파일을 불러와 데이터 전처리하고,

gnuplot을 이용하여 해당 데이터를 시각화해보자.

image



실습

우선 gnuplot 프로그램을 설치해주어야한다.

아래의 링크를 통해 다운로드할 수 있다.

http://www.gnuplot.info/

image

image


다운로드를 마쳤다면, 이제 plot해줄 데이터 파일을 만들어주자.

로그 파일의 데이터들을 본인이 편한 방식으로 전처리해준다.

필자는 데이터를 한 줄씩 읽어와 ‘\t’ 탭 간격 기준으로 잘라 numpy를 이용해 배열 형식으로 저장해주었다.

그런 다음 각각의 데이터를 인덱스화 해주었다. 즉, (0,0) ~ (최대 길이, 최대 길이) 범위만큼 [x좌표, y좌표, value] 이런 형식으로 저장해주었다. (추측이지만, gnuplot을 하기 위해서는 이런식으로 저장해줘야 하는 듯하다.)

그 데이터를 “data.dat” 이름의 파일에 write 해주었다. (이것도 .dat 확장자의 파일로 해줘야하는 듯 하다.)

그러면 아래와 같은 형식으로 데이터가 저장된다.

image


데이터 파일을 다 만들었다면 이제는 gnuplot 프로그램을 실행하여 데이터 파일을 시각화하여 확인해보자.



소스 코드

file = open('sampleData.log', 'r')

lines = file.read().splitlines()
file.close()

data=[]
for line in lines:
    if not line:
        continue

    columns = [col.strip() for col in line.split('\t') if col]
    data.append(columns)

np_arr = np.array(data)
print(np_arr)

s_dataset = []
ss_dataset = []
for i in range(len(np_arr)):
    for j in range(len(np_arr[1])):
        
        s_dataset.append([i, j, int(np_arr[i][j])])

print(s_dataset)

file = open("data.dat", "w")
for i in range(len(np_arr)):
    for j in range(len(np_arr[1])):
        
        file.write(str(j) + " " + str(i) + " " + str(np_arr[i][j]))
        file.write("\n")
    file.write("\n")
file.close()


결과

임의로 로그 파일을 작성해서 만들고, 위의 소스코드를 실행하면 데이터가 저장된 data.dat 파일이 생성된다.

그러면 gnuplot 프로그램을 실행하여 아래의 그림과 같이 해당 .dat 파일의 경로로 접근하여 plot 명령어를 통해 결과를 확인할 수 있다.

image

image

이미지에서 볼수 있는 것처럼 해당 좌표의 Value에 해당하는 색상이 픽셀마다 표시가 된다.

내가 사용한 로그파일을 전처리한 방식은 왼쪽 위의 데이터가 (0, 0) 좌표이고 오른쪽 아래로 갈 수록 좌표가 커지므로

출력되는 이미지는 상하로 반전된 모양으로 나타난다.

이해하기 쉽게 다시 설명하자면,

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

위와 같은 데이터를 우리가 보는 그대로 gnuplot을 이용해 색깔로 표현하고자 한다면, 가장 왼쪽 아래의 13이라는 값이 (0, 0) 좌표를 가져야한다.

하지만 필자가 전처리한 방식은 가장 왼쪽 위의 1이 (0, 0) 좌표를 가지기 때문에 해당 값이 13 자리에 색깔로 표현된다.

그래서 data.dat 파일에 write해줄 때, x좌표를 반전시키도록 (i, j) 좌표를 (-i, j) 좌표로만 바꿔주면 해결할 수 있다. (아래 코드 참고)

file = open("data.dat", "w")
for i in range(len(np_arr)):
    for j in range(len(np_arr[1])):
        
        file.write(str(j) + " " + str(i) + " " + str(np_arr[-i][j]))  // i -> -i 로만 바꿔주면 된다.
        file.write("\n")
    file.write("\n")
file.close()

image