Передача массива данных в gnuplot через канал в c, а не в файл - PullRequest
6 голосов
/ 02 марта 2012

Прямо сейчас я передаю файл в gnuplot через канал в c, что-то вроде этого:

 fprintf(gnuplotPipe, "plot \"data-file.dat\" using 1:2\n"); 

Есть ли способ, которым мне не нужно записывать данные в файл, а затемпередать его в gnuplot, например, как-нибудь передать массив или поток в gnuplot, чтобы я мог пропустить запись в файловый процесс и затем удалить файл?Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

Конечно, вы можете сделать это.Пример команды терминала, которая отображает две точки, соединенные линией:

echo "plot \"< echo -e '4 5\n 3 2'\" w lp pt 2" | gnuplot

Если вы хотите получить вывод PostScript, вы можете добавить следующее:

echo "set terminal postscript; plot \"< echo -e '4 5\n 3 2'\" w lp pt 2" | gnuplot &> out.ps

Если вы сейчасиспользуйте system () или popen () (для перехвата выходного потока), остальное должно быть простым.

Редактировать: Кажется, существуют некоторые интерфейсы C (++) - Gnuplot.Посетите этот веб-сайт , который дает отличный обзор обёрток на C, C ++, Python и Fortran.Я не уверен, что они обновлены и работают с последними версиями Gnuplot, но если их не адаптировать, это не должно быть так сложно.

0 голосов
/ 09 сентября 2015

Gnuplot понимает имя файла '-' для обозначения предстоящих данных. Итак, вырезать и вставить из того, над чем я сейчас работаю:

FILE *f = popen("gnuplot", "w");

fprintf(f, "set term png; "
"set out 'beforeafter.png'\n"
"set xlabel 'before'\n"
"set ylabel 'after'\n"
"plot '-'\n");

//Am using Apophenia in my project, so use its print function to print the data
apop_data_print(dataset, .output_pipe=f);

//or use fprintf directly
for (int i=0; i< data_len; i++)
  fprintf(f, "%g %g\n", data_x[i], data_y[i]);

fclose(f);
...