공학도라면 논문을 쓰거나 보고서, 발표자료를 작성할 때 실험 데이터를 파일로 출력한 후 Microsoft Excel 차트 도구들이나 MATLAB plot 도구들을 사용하여 파일을 읽어 그래프로 그린 적이 있을 것입니다. 왜냐하면, C/C++언어에서는 그래프를 조작하기 위한 기본 라이브러리를 포함하고 있지 않기 때문에, 그래프를 그리려면 ChartFX와 같은 상용 라이브러리를 사용하거나 직접 코딩을 해야합니다.
Gnuplot은 리눅스 환경에서 그래프를 그려주는 도구로 개발되었다가 윈도우즈 환경으로도 포팅되었습니다. Gnuplot 자체도 C++ 프로그래머를 위해 그래프를 직접 제어가능한 API를 제공하지는 않지만, 약간 우회적인 방법(Gnuplot 윈도우에 명령어 캐릭터를 직접 전송하는 방법)으로 C++프로그램과 연동하는 방법이 있습니다. 이미 gnuplot++이 이러한 방법을 사용하여 API를 구현해 놓았습니다. 구글링 해보면 이것 외에도 여러 개가 검색이 됩니다. 그렇다면 왜 다시 gnuplot API를 만들게 되었는가? 검색되는 API들은 오래된 소스들이 많고 VC에서 컴파일이 잘 안되며 plot을 위해 새로운 API를 정의하여 API의 사용법을 익혀야만 했습니다. 원하는 것은 Gnuplot의 명령을 수정없이 그대로 사용하고 API를 구현한 소스코드도 짧고 이해가 쉬운것입니다. 그래서 다시 한 번 만들어 보기로 했습니다.
아래 두 개의 소스코드가 Gnuplot과 연동하는 API 역할을 합니다.
Gnuplot을 설치하기 위해 공식 웹사이트 http://www.gnuplot.info/ 에서 최신 버전(현재 릴리즈 버전은 4.2.6임)의 파일을 받습니다. 설치 파일은 제공하지 않고 zip으로 압축되어 있습니다. 프로그램을 설치할 폴더에 압축을 풀어주는 것으로 설치과정이 끝납니다. 그리고 Gnuplot의 공식 웹사이트의 demo gallery에 방문하면 많은 분량의 예제와 실행화면을 볼 수 있습니다. 잘 설치되었는지 확인하기 위해 압축을 푼 폴더 아래 bin 폴더 안의 wgnuplot.exe를 실행해서 정상적으로 실행되는지 확인합니다.
마지막으로 우리가 작성중인 C++ 소스코드 내에 헤더파일 pgnuplot.h을 인클루드 하고 CpGnuplot 클래스를 사용하면 됩니다.
#include "pGNUPlot.h"
...
// CpGnuplot의 생성자에서 인자로 wgnuplot.exe의 전체 경로를 넘겨준다.
// Gnuplot을 설치한 경로에 따라 이 값을 바꿔야 한다.
CpGnuplot plot ("C:\\Program Files\\gnuplot\\bin\\wgnuplot.exe");
// Gnuplot의 splot 명령을 사용하여 그래프를 그린다.
plot.cmd ("splot [x=-3:3] [y=-3:3] sin(x) * cos(y)");
실행하면 아래와 같은 멋진 그래프가 출력됩니다.
만든 데이터를 파일로 저장하고 이 파일을 불러다가 그래프를 그릴 수도 있습니다.
#include <math.h>
#include "pGNUPlot.h"
...
// CpGnuplot의 생성자에서 인자로 wgnuplot.exe의 전체 경로를 넘겨준다.
// Gnuplot을 설치한 경로에 따라 이 값을 바꿔야 한다.
CpGnuplot plot ("C:\\Program Files\\gnuplot\\bin\\wgnuplot.exe");
FILE *fp = fopen ("C:\\temp\\1.dat", "wt");
if (fp) {
for (double i=0; i<20.; i+= 0.01) {
fprintf (fp, "%f, %f\n", i, sin(i));
}
fclose (fp);
}
plot.cmd ("plot 'C:\\temp\\1.dat' with lines");
실행하면 아래와 같은 sin 그래프가 출력됩니다.
Gnuplot의 공식 웹사이트의 demo gallery를 살펴보면 더 많은 종류의 그래프와 그리기 위한 스크립트가 있으니 참조하시면 됩니다.
2010.5.25 추가:
Microsoft Visual Studio 에서 프로젝트를 만드신 경우, 좌측 Solution Explorer에서 프로젝트를 선택하시고 상단 메뉴의 View - Property Pages 메뉴를 선택하시면 다음과 같이 Property 설정 창이 뜹니다. 여기서 Character Set을 "Use Multi-Byte Character Set"으로 선택하여야 합니다.
그리고 pGNUPlot.cpp 파일 제일 처음에 "StdAfx.h" 파일도 인클루드 해야합니다.
2010.6.7 추가:
예제 프로젝트를 추가 합니다.
아래는 실행 화면입니다.
2010.6.17 추가:
유니코드를 사용하도록 예제 프로젝트를 수정하여 올립니다. 유니코드를 사용하는 프로젝트에서 사용하실 경우 아래 예제 프로젝트에서 pGNUPlotU.cpp 파일과 pGNUPlotU.h 파일을 가져다 쓰시면 됩니다.
2010.9.29 추가:
pGNUPlot.cpp 파일과 pGNUPlotU.cpp 파일의 소소한 버그를 수정하였습니다.
수정한 코드는 TestGNUPlot.zip 파일과과 TestGNUPlotU.zip 파일에 반영되어 있습니다.