GNU Octave 플로팅
GNU Octave 플로팅 (Plotting)
Octave로 계산 결과를 그래프로 그려 시각화하는 방법을 살펴볼게요. 옛 버전의 Octave는 gnuplot을 통해 플롯을 그렸는데, 이 기능은 여전히 사용할 수 있어요. 다만 최신 버전은 OpenGL 기반의 더 현대적인 플로팅 기능을 제공해요. 어느 플로팅 시스템을 쓸지는 graphics_toolkit 함수로 정해요.
본문
그래픽 툴킷 선택
graphics_toolkit ("qt")는 Qt/OpenGL 시스템을, graphics_toolkit ("fltk")는 FLTK/OpenGL 시스템을, graphics_toolkit ("gnuplot")은 gnuplot 시스템을 선택해요. 세 시스템은 각 figure의 그래픽 핸들에 있는 graphics_toolkit 속성으로 개별 적용할 수도 있어요.
주의: OpenGL 기반 툴킷은 내부적으로 단정밀도(single precision) 변수를 사용해서 표시 가능한 최댓값이 약 10^38로 제한돼요. 더 큰 값을 다루려면 최대 10^308까지 지원하는 gnuplot 툴킷을 써야 해요. 마찬가지로 단정밀도 변수는 10진수 6~9자리밖에 정확히 표현하지 못하므로, 약 1e-8 수준의 미세한 차이를 담은 데이터 역시 gnuplot 툴킷이 필요해요.
gnuplot 툴킷은 외부 프로그램인 gnuplot을 사용해요. Octave에서 gnuplot으로의 통신은 단방향 파이프를 통해 이뤄져서, 데이터가 많으면 성능이 크게 느려지고 Octave가 플롯 창과의 사용자 상호작용(크기 조절, 이동, 닫기 등)을 알 수 없어요.
2차원 플롯
plot 함수는 선형 축을 가진 간단한 x-y 플롯을 만들어요. 예를 들어:
x = -10:0.1:10;
plot (x, sin (x));
xlabel ("x");
ylabel ("sin (x)");
title ("Simple 2-D Plot");
이 명령은 사인파를 그려요. 대부분의 시스템에서 이 명령은 별도의 그래프 창을 열어 그래프를 보여줘요.
가장 단순한 형태는 plot (y)인데, 이때 인자는 y 좌표 집합으로 해석되고 x 좌표는 1:numel (y) 범위로 간주해요. 인자가 여럿이면 다음과 같이 해석돼요.
- 데이터 인자가 하나면 그 인자를 y 좌표로 보고, x 좌표는 1부터 시작하는 원소 인덱스로 삼아요.
- x와 y가 둘 다 스칼라면 점 하나가 그려져요.
- 둘 중 하나가 스칼라이고 다른 하나가 벡터면, 그 스칼라와 벡터의 각 원소가 만드는 좌표들에 점들을 그려요.
- 둘 다 벡터면 y의 원소들을 x의 원소들에 맞춰 그려요.
- x가 벡터이고 y가 행렬이면 y의 열(또는 행)들을 x에 맞춰 그려요.
- 둘 다 행렬이면 y의 열들을 x의 열들에 맞춰 그려요. 이 경우 두 행렬의 행과 열 수가 같아야 해요.
여러 property-value 쌍을 지정할 수 있는데, 반드시 쌍으로 나타나야 해요. 이런 인자들은 plot이 그린 line 객체에 적용되며, 유용한 속성으로 "linestyle", "linewidth", "color", "marker", "markersize", "markeredgecolor", "markerfacecolor" 등이 있어요.
fmt 형식 인자로 플롯 스타일을 제어할 수도 있어요. "<linestyle><marker><color><;displayname;>" 형태의 문자열이에요. 마커만 지정하고 선 스타일이 없으면 마커만 그려지고, 선 스타일만 지정하면 선만 그려져요. 둘 다 지정하면 선과 마커가 함께 그려져요. 형식 인자가 없으면 기본값은 마커 없는 실선이고, 색은 현재 axes의 "colororder" 속성이 정해요.
- 선 스타일:
-실선(기본),--점선,:점선(dotted),-.일점쇄선 - 마커:
+크로스헤어,o원,*별,.점,x십자,|세로선,_가로선,s사각형,d다이아몬드,^위쪽 삼각형,v아래쪽 삼각형,>오른쪽 삼각형,<왼쪽 삼각형,p펜타그램,h헥사그램 - 색:
k/"black"검정,r/"red"빨강,g/"green"초록,b/"blue"파랑,y/"yellow"노랑,m/"magenta"마젠타,c/"cyan"시안,w/"white"흰색
세미콜론 사이의 텍스트는 플롯 범례(legend) 라벨을 정하는 "displayname" 속성으로 쓰여요. 예: "+b;Data Series 3;". 마지막 세미콜론은 필수라서 빠뜨리면 Octave가 오류를 내요.
예시:
plot (x, y, "or", x, y2, x, y3, "m", x, y4, "+")
plot (b, "*", "markersize", 10)
t = 0:0.1:6.3;
plot (t, cos(t), "-;cos(t);", t, sin(t), "-b;sin(t);");
첫 인자가 axes 핸들 hax면 현재 axes(gca) 대신 그 axes에 그려요. 선택적 반환값 h는 생성된 line 객체들의 그래픽 핸들 벡터예요. 플롯을 PostScript나 PNG 같은 이미지 형식으로 저장하려면 print 명령을 쓰면 돼요.
plotyy 함수는 독립적인 두 개의 y 축을 가진 플롯을 만들어요. plotyy (x1, y1, x2, y2) 형식이며, 기본적으로 feval (@plot, x, y)로 평가돼요. fcn 인자로 플롯 유형을 바꿀 수 있고, fun1/fun2로 각 플롯의 함수를 독립적으로 정할 수도 있어요. 반환값 ax는 두 y 축의 axes 핸들 벡터예요.
축 설정
axis 함수는 기존 플롯의 축 한계와 종횡비, 눈금(tick) 모양 같은 여러 축 속성을 바꿔요. 기본적으로 plot 같은 고수준 플롯 함수는 axes 속성을 초기화하므로, axis나 xlim 등으로 속성을 바꾸려면 플롯을 그린 뒤(또는 hold 함수를 호출한 뒤)에 해야 해요.
axis ([x_lo x_hi]), axis ([x_lo x_hi y_lo y_hi])처럼 2, 4, 6, 8 원소 벡터로 축 한계를 지정해요. 첫 두 원소는 x 축, 다음 두 개는 y 축, 그다음은 z 축, 마지막 두 개는 색 축을 정해요. -Inf와 Inf 특수값은 axes의 데이터에 기반해 한계를 자동 계산하라는 뜻이에요. 인자 없이 호출하면 자동 스케일링을 켜요.
플롯을 이미지로 저장하려면 print를 쓰고, 범례는 legend, 제목은 title, 축 라벨은 xlabel/ylabel을 써요.
더 알아보기
graphics_toolkit으로 플로팅 백엔드(Qt/FLTK/gnuplot)를 선택해요- 2차원
plot, 두 y 축plotyy, 축 설정axis를 조합해 원하는 그래프를 만들어요 - 데이터가 매우 크거나(
10^38초과) 미세한 차이(1e-8)를 담고 있으면 OpenGL 대신 gnuplot 툴킷을 써야 해요