C++로 차트 그리기 위해 gnuplot 을 사용하였는데요.
사용해보니 gnuplot은 아주 유용한 라이브러리네요. 홈페이지를 참고해주세요.
gnuplot을 vs에서 사용하기 위해 먼저 설치를 하고, 설치된 경로를 활용하면 됩니다.
- 최신버전 설치
- 설치 경로 입력
gnuplot을 사용한 C++파일은 아래 포스트를 참고하였습니다.
blog.daum.net/slo/blog.daum.net/slo/2186
위 파일을 받아서 사용하면 됩니다.
// 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();
}
그 외 명령어
- 차트 여러개 그리기
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
'그 외 코드 > C, C++' 카테고리의 다른 글
[C/C++] Visual Studio BLE(Bluetooth LE) 데이터 읽기 (Window 10) (0) | 2020.09.18 |
---|---|
[C언어] 십진수 이진수로 바꾸는 코드 (0) | 2020.01.08 |
int, string, char 형변환 (0) | 2019.12.07 |
[C++] vector 사용 법 (0) | 2019.12.07 |