본문 바로가기

그 외 코드/C, C++

[C++ gnuplot] Visual Studio로 데이터 받아 2D/3D chart, 그래프 그리기

728x90
반응형

 

 

C++로 차트 그리기 위해   gnuplot  을 사용하였는데요.

사용해보니 gnuplot은 아주 유용한 라이브러리네요. 홈페이지를 참고해주세요.

gnuplot을 vs에서 사용하기 위해 먼저 설치를 하고, 설치된 경로를 활용하면 됩니다.

  1. 최신버전 설치
  2. 설치 경로 입력

gnuplot을 사용한 C++파일은 아래 포스트를 참고하였습니다.

blog.daum.net/slo/blog.daum.net/slo/2186

TestGNUPlotU.zip
0.01MB

위 파일을 받아서 사용하면 됩니다.

// CpGnuplot의 생성자에서 인자로 wgnuplot.exe의 전체 경로를 넘겨준다.
// Gnuplot을 설치한 경로에 따라 이 값을 바꿔야 한다.
CpGnuplot plot("D:\\gnuplot\\bin\\wgnuplot.exe");

여기서 gnuplot이 설치된 경로를 입력해주세요.

그다음은 식을 입력하여 차트를 그리면 됩니다.

// Gnuplot의 splot 명령을 사용하여 그래프를 그린다.
plot.cmd("splot [x=-3:3] [y=-3:3] sin(x) * cos(y)");

 

 

빌드 에러


위 파일을 빌드하면 에러가 나는데 밑과 같이 해결하면 됩니다.

  • const char * 형식의 인수가 LPCWSTR 형식의 매개변수와 호환되지 않습니다.

프로젝트 => 프로젝트이름 속성 => 구성속성 =>고급 =>문자집합 => 설정안함
또는 유니코드 문자집합을 사용하는 방법 :
 char -> wchar_t로 바꿔주고, CpGnuplot plot(L"..\..\..\wgnuplot.exe"); ""앞에 L을 붙여준다.

  • 'strncpy': This function or variable may be unsafe.

전처리기 _CRT_SECURE_NO_WARNINGS 추가
(#define _CRT_SECURE_NO_WARNINGS 또는 설정->전처리기->편집을 통해 추가)

 

 


 

Data 받아서 그리기


 

텍스트파일에 있는 data를 차트로 그릴 수 있습니다.

메모장에 데이터를 입력하고 파일로 저장합니다.

이 중 2열, 3열, 4열을 y축에 동시에 그려보도록 하겠습니다.

void plotGyroscope() {
    //gnuplot 설치 경로
    CpGnuplot plot("D:\\gnuplot\\bin\\wgnuplot.exe");

    //그리기 설정
    plot.cmd("reset");
    
    //border 위, 오른쪽 없애기
    plot.cmd("set ytics nomirror");
    plot.cmd("set xtics nomirror");
    plot.cmd("set border 3");
    //border line width
    plot.cmd("set border lw 0.3");
    //plot.cmd("set format x ''"); x축 값을 format할 수 있습니다.
    //그래프 사이즈 설정
    plot.cmd("set terminal wxt size 1280,960");
    //x, y축 label
    plot.cmd("set xlab \"sample\"");
    plot.cmd("set ylab \"dps\"");
    //title
    plot.cmd("set title \"Gyroscope\"");

    //3개의 데이터 line style
    plot.cmd("set style line 1 linecolor rgb \"red\"");
    plot.cmd("set style line 2 linecolor rgb \"green\"");
    plot.cmd("set style line 3 linecolor rgb \"blue\"");

    //데이터 그리기
    plot.cmd("plot 'E:\\05IMU\\00IMU_Position\\imu_position\\imuData.txt' u :2 title \"X\" with l linestyle 1,\\");
    plot.cmd("'E:\\05IMU\\00IMU_Position\\imu_position\\imuData.txt' u :3 title \"Y\" with l linestyle 2, \\");
    plot.cmd("'E:\\05IMU\\00IMU_Position\\imu_position\\imuData.txt' u :4 title \"Z\" with l linestyle 3");
    
    getchar();
}

 

데이터 그리는 코드를 살펴보면,

//데이터 그리기
plot.cmd("plot 'E:\\05IMU\\00IMU_Position\\imu_position\\imuData.txt' u :2 title \"X\" with l linestyle 1,\\");

 

  • plot 'txt파일경로'  : txt 파일을 그립니다.
  • u(sing) :2  : 2열을 y축에 그립니다. (x축:y축)
  • title "X"  : line 제목을 X라고 합니다.
  • with l(ine)  : line으로 그립니다.
  • linestyle 1  : 색이나 width, font등을 정해서 쓸 수 있습니다. (set style line 1 ...)
  • \를 입력후 또 다른 데이터를 적어주면 여러 데이터를 한 그래프에 그릴 수 있습니다.

 

결과는 다음과 같습니다.

 


 

3D animaition 그리기


 

t x y z 순으로 데이터를 저장하여 3d 에니메이션도 그릴 수 있습니다.

 

 

void runAnimation() {
	CpGnuplot plot("D:\\gnuplot\\bin\\wgnuplot.exe");
        
	plot.cmd("reset");
	plot.cmd("set border lw 0.3");
	plot.cmd("set terminal wxt size 1280,1080");
	plot.cmd("set style line 1 linecolor rgb \"blue\"");
	plot.cmd("set grid");
	plot.cmd("set autoscale");
	plot.cmd("fname = \"linPosHPDataAnim.txt\"\n");
	plot.cmd(" do for [ii=1:11617] { \n");
	plot.cmd(" set title 'time '.ii\n");
	plot.cmd("splot fname using 2:3:4 every ::1::ii w l ls 1 lw 1.5 title 'path', \\");
	plot.cmd("      fname using 2:3:4 every ::ii::ii w p pt 7 ps 1.5 lc rgb \"red\" title 'current'}");
	getchar();
}

 

 


 

 

 

그 외 명령어


 

  • 차트 여러개 그리기

blog.daum.net/wh1988ha/121

set multiplot

set size 0.5,0.5
set origin 0,0.5
plot sin(x)

set size 0.5,0.5
set origin 0.5,0.5
plot cos(x)

set size 0.5,0.5
set origin 0,0
plot tan(x)

set size 0.5,0.5
set origin 0.5,0
plot x**2

unset multiplot

 

 

 

 


 

728x90
반응형