데이터 파일이 density matrix 형태일 때 density plot 을 그리는 방법.


* 데이터파일 구조 (density matrix 형태)

1 2 3

4 5 6

7 8 9


* gnuplot 에서 그리는 방법

 >>> set pm3d map

 >>> splot './data.txt' matrix 


우선 Heatmap을 matrix 형태의 데이터로부터 그리는 방법부더 살펴보자.


gnuplot에서


set pm3d map 

set pm3d interpolate 0,0

splot "./aaa.txt" matrix every ::4 


첫째 줄은 pm3d 형태의 map을 그리겠다고 설정해준 것이고, 두번째는 그림의 내삽을 할지말지 정하는 것이다. 보통 안하는게 데이터를 눈으로 보기에 좋다.

세번째로 그림을 그리는 부분인데, matrix 를 꼭 붙여야 한다! 안그러면 x, y, z 축으로 각 컬럼을 인식한다...

every명령어는 이 블로그 어딘가에 있는데, 지금 저건 4번째 column부터 그리라는 의미.


color bar의 색을 바꾸려면,


set palette defined (0 "green", 1 "red")


이렇게 해주면 녹색부터 빨간색까지로 바뀐다. 정말 쉬운 방법인데, 자신이 색을 직접 rgb로 정해주거나 내장된 다른 팔래트를 이용할 수도 있다. 이건 나중에 구글링...


color bar의 range를 바꿀 수도 있다.


set cbrange[10:100]


이렇게 쓰면 colorbar의 색 범위를 정해주는데, 예시에서는 10~100까지로 정해주었다.

'Study > Gnuplot' 카테고리의 다른 글

density plot 그리기  (0) 2014.05.18
gnuplot 에서 그림에 한글 사용하기  (0) 2013.07.02
data에서 원하는 줄만 골라 그리기  (0) 2013.05.27
Fitting parameter를 출력하기  (0) 2013.05.21
Line과 Point의 Style 지정해주기  (0) 2012.07.29

파일 이름이 한글로 되어있어 plot의 title에 한글이 표시되어야 할 일이 있었다.


그런데... 이게 무슨 짓을 해도 글자가 깨져나온다. (윈도우 gnuplot에서 테스트 함..)


1. set encoding utf8

이걸 해도 결국 내가 쓴 글자가 utf8이 아니라서 그런지 알아듣지를 못한다.


그래서 폰트 때문인가 고민하다가


2. set term postscript eps color "굴림" 24

이렇게 한글 폰트를 주어도... 깨진다...ㅜ (어짜피 인코딩이 안맞았으니ㅜ)


그러다 문득 pdf로 만들면 어떨까 싶어서 해봤는데, 


3. set term pdfcairo 

그다음 set output './aaa.pdf'


그리고 그림을 그리면 한글파일도 title에 잘 써준다! (근데 몇개는 그래도 깨지네..)

단 이 pdf 파일을 열려면 gnuplot을 닫아주어야 한다. 그래야 pdf파일을 온전하게 만들어준다.


그냥 팁...

Gnuplot에서 plot을 할 때 data file에서 원하는 줄만 골라서 그리는 방법!


column을 고를 때에는 using 1:2 이렇게 쓰면 되지만, row를 고를 때에는 다른 방법이 필요하다. 구글에서 검색해보니,  every 명령을 쓰면 된다고 한다. 용법은 다음과 같다.


every I:J:K:L:M:N


1. I : Line increment

2. J :  Data block increment

3. K : The first line

4. L : The first data block

5. M : The last line

6. N : The last data block


사실 data block이 뭔지 모르겠다...ㅜ 아래는 gnuplot 홈페이지에서 가져온 쉬운 예제들.

every 2plot every 2 line
every ::3plot from the 3-rd lines
every ::3::5plot from the 3-rd to 5-th lines
every ::0::0plot the first line only
every 2::::6plot the 1,3,5,7-th lines
every :2plot every 2 data block
every :::5::8plot from 5-th to 8-th data blocks

출처 : http://dbbrtdb.wordpress.com/2010/08/09/gnuplot-line-style-every/

http://web.archive.org/web/20100829220255/http://t16web.lanl.gov/Kawano/gnuplot/datafile2-e.html


Gnuplot에서 어떤 함수를 fitting 후에 쓰인 parameters 를 label로 출력해야 하는 경우가 있다. 

Fitting에서 나오는 결과들은 모두 fit.log에 저장되어 있지만 여기서 일일히 parameters를 찾아서 손으로 써줄 수는 없는 일이다.


다음과 같이 하면 아주 쉽게 label 에 parameters의 값들을 써줄 수 있다.


parameters : a, b

f(x) = a*x + b

fit f(x) './test.txt' u 1:2 via a, b

이후에

ti = sprintf("%.2f", a)

p './test.txt' w lp, f(x) title ti


여기서 sprintf의 arguments들은 대충 C의 것과 비슷해보인다.


이렇게 하면 손쉽게 parameters의 값들을 그래프에 쓸 수 있다!


Ref : http://stackoverflow.com/questions/6593134/gnuplot-printing-fit-parameters-automatically



plot.py


꽤 많은 데이터들을 gnuplot으로 plot을 하고 싶을 때가 있다. 사실 python에서 matplotlib와 numpy로 싹 그릴수도 있지만 matplotlib에서 지원해주는 옵션을 자유자재로 다루기가 어려운 경우가 다반사다. 그렇다고 plot을 안할수는 없는 노릇이고... 


그냥 gnuplot의 스크립트 파일(e.g. plot.plt)을 만들어 실행시키는 방법을 써보자.


python이 빠르고 쉽게 문자열을 다룰수 있다는 강점이 있어 이를 사용했다.

(결국 python 관련 글....)


import glob


Flist = glob.glob('*.dat')


fwriteName = "plot.plt"

fw = open(fwriteName, 'a')


fw.write("set term png\n")    # 여기에 자신이 처음 입력할 terminal 옵션을 넣어주자


OldExt = 'dat'

NewExt = 'png'



for i in range(len(Flist)):

#Read file to know how many tab      # 데이터에서 tab이 여러번 먹혀있으면 엉망이되므로 주의!

fr = open(Flist[i], 'r')

StrContent = fr.readline()

TabCount = StrContent.count('\t')



fpngName = Flist[i].replace(OldExt, NewExt)


StrOutput = 'set output \'' + fpngName + '\'\n' 


fw.write(StrOutput)

LastCol = TabCount + 1


StrPlot = 'p \'./' + Flist[i] + '\' u ' + str(LastCol) + ':($3/$2) w p, \'\' u ' + str(LastCol) + ':($4/$2) w p\n'     #이런식으로 plot 옵션을 적어주면 된다. 근데 ' 등의 특수문자를 써야해서 꽤 주의해야 한다.

fw.write(StrPlot)


이를 실행시키면 한 디렉토리 안에 있는 dat파일을 모두 읽어 자신이 지정한 방법대로 그림을 그려 png로 저장해준다. 이 프로그램을 그대로 쓰기엔 조심할 점이 있는데, 


1    2    3        4    5

..   ..    ..       ..    ..


원래 데이터파일이 위와같이 tab이 여러번 존재한다고 해보자. gnuplot은 그래도 착하게 우리가 눈으로 보는 것과 같이 행을 구분해준다. using 1:4 와 같은 식으로 옵션을 써주어도 우리가 의도한대로 잘 실행된다.

하지만 위의 프로그램에서는 Column의 개수를 tab의 수로 가정했기 때문에 중복된 tab(위의 예제에선 3과 4 사이)를 없애주어야 한다. 없애는 방법은 아래 링크를 참조!

http://amornatura.tistory.com/62

'Study > Computer' 카테고리의 다른 글

pylab과 pyplot의 차이?  (0) 2012.10.22
matplotlib에서 자주쓰는 옵션들 정리(진행중)  (0) 2012.10.22
python으로 중복된 tab없애기  (0) 2012.10.03
ssh 접속이 안될때  (0) 2012.09.21
Ubuntu superuser 추가하기  (0) 2012.09.20

논문들을 보면 참 예쁜 그래프(!)들이 많이 보인다. 그냥 점과 선인데도 왜 내 그래프와 다르게 예뻐보이는거지?! 이유는 간단하다. 그건 유명한 저널들 속에 있기 때문이다. ㅎㅎㅎㅎ 사실 그래프 예쁘게 그리기는 생각보다 중요한(?) 기술인데, 우선 Line과 Point의 Style을 지정해주는 방법부터 보자.

 

gnuplot> 이 상태에서 써주어도 되고 *.gpi 나 *.gnu형태의 파일로 작성해도 된다.

 

1. set linestyle 1 1 lt 1 lw 1  =====> 이건 옛날버전에서만 가능하다. 최신버전[각주:1]이라면 2번처럼 하시길!

2. set style line 1 lt 1 lw 1

 

여기서 옵션 설명은,

  • lt  => line type 이다. 뒤에 숫자에 따라 line의 색이 달라진다. (이건 지정되어 있어 그냥 쓰기 편리하다.)
  • lw => line width 이다. eps 파일로 만들 경우 lw 의 크기는 3~4가 적당하다.
  • pt => Point type이다. 역시 뒤의 숫자에 따라 point의 모양이 달라진다. 소수점으로 크기 지정 가능!
  • ps => point size이다. 2 or 3 까지만 사용해도 크기가 꽤 커진다.
  • lc => line color이다. 뒤의 숫자에 따라 색이 변하는데, 아래의 그림의 순서와 같다.
    검은색이 필요하다면 lc -1로 옵션을 두시라.

 

아래의 그림을 보면 편리하다. f(x)부터 순서대로 lt 1, pt 1이고 숫자가 하나씩 커진다.

그래프를 여러개 그려야 할 경우, set style로 미리 지정해두고 그림을 그리면 된다. 어떻게 그리냐면,

 

plot f(x) ls 1 w lp

여기서 ls => line style을 말한다. 지정되지 않은 line style을 불러올 경우 에러를 뱉고 그래프 안그려주니 조심하시길!

 

 

  1. 어느 버전부터 바뀌었는지 까먹었다.. 아무튼 둘 중 하나가 되니 해보시길! [본문으로]
연구실에서 여러 일을 해보다가 배운 쉽고 놀라운 Gnuplot의 스킬들을 노트해봅니다.

우선 multiaxis 사용하기입니다. 이를 이용하면 한 화면에 그래프를 2개 그리고 축도 2개로 같이 그릴 수 있습니다.
방법은 매우 간단하며 두 개의 데이터를 나란히 비교해볼 때 아주 좋습니다.

간단히! ㅋㅋ

아래 코드에서 주의할 점은 nomirror 설정을 안할 경우 두 번째 y축의 눈금이 거울에 반사된 것 처럼 보인다는 것이 있구요.
꼭 plot 할 때 축을 정해주어야 한다는 점입니다. 축을 정해주지 않으면 x1y1으로 그려지니까 모든게 허당~

x1은 아래 방향의 x축을, x2는 윗 방향의 x축을 의미하고
y1은 왼쪽의 y축을, y2는 오른쪽의 y축을 의미합니다.


gnuplot> set y2tics
gnuplot> set tics nomirror
gnuplot> p './a.dat' u 1:2 w lp, './b.dat' u 1:3 axes x1y2 w lp


글쓰다가 알게된 사실...
axis 는 축을 말하는데요. 복수형이 axes이더군요... http://gnuplot.sourceforge.net/ 에서는 multiaxis라고 쓰니 저도 따라서 axis로 고쳤습니다.

+ Recent posts