25

我是一名机械工程师,C 编程知识有限。我写了一些代码来进行模拟,我想可视化模拟结果。目前我正在使用它Dev-C来编写我的代码。使用fopenfprintf命令我生成一个.dat包含结果的文件。然后我打开GNUPLOT程序并导入我的.dat文件来绘制结果。这需要时间,我必须等到模拟结束。有没有一种简单的方法可以将我的绘图仪与 连接Dev-C,以便我的绘图仪在模拟期间开始绘制数据?任何图书馆等?

4

6 回答 6

19

既然您已经知道 gnuplot,那么最简单的做法可能就是从您的程序中调用 gnuplot 并将数据通过管道传递给它:

FILE *gnuplot = popen("gnuplot", "w");
fprintf(gnuplot, "plot '-'\n");
for (i = 0; i < count; i++)
    fprintf(gnuplot, "%g %g\n", x[i], y[i]);
fprintf(gnuplot, "e\n");
fflush(gnuplot);
于 2013-01-14T12:48:43.960 回答
4

好的,当您写入文件时,一种解决方案是system()在您写入文件时拨打电话,然后调用 gnuplot。

但是,这意味着您每次都应该更改文件名,但我担心如果您这样做,它看起来会不正确,因为您每次都发送少量数据。

http://www.gnu.org/software/libc/manual/html_node/System-Calls.html

我从未使用过 gnuplot,但如果您查看此页面 ( http://gnuplot-tricks.blogspot.com/ ),您可能会发现一些可以使其正常工作的技巧。

但是,我认为,除非您要自己绘制所有内容并跳过 gnuplot,否则您可能只需要等待,就像您一样。

您可能会发现 gnuplot 的 C 接口可以帮助您:

http://ndevilla.free.fr/gnuplot/

于 2013-01-14T02:39:50.257 回答
4

我一直在使用PLPlot从 C 中绘图,发现它既有效又简单。它是跨平台的、开源的,并支持丰富的绘图功能。我建议您查看示例以开始使用。

于 2013-01-14T05:05:36.520 回答
2

pbPlots 非常易于使用并且适用于所有 C 编译器。

从github 页面下载 pbPlots.c/h 和 supportLib.c/h并将它们包含在您的构建中。

这是一个完整的示例,它将在 PNG 文件中生成绘图。

#include "pbPlots.h"
#include "supportLib.h"

int main(){

    double x [] = {-1, 0, 1, 2, 3, 4, 5, 6};
    double y [] = {-5, -4, -3, -2, 1, 0, 1, 2};

    RGBABitmapImageReference *imageRef = CreateRGBABitmapImageReference();

    DrawScatterPlot(imageRef, 600, 400, x, 8, y, 8);

    size_t length;
    double *pngData = ConvertToPNG(&length, imageRef->image);
    WriteToFile(pngData, length, "plot.png");

    return 0;
 }

生成的图

还有更多可用的选项,这些在 github 页面上进行了描述。

于 2020-05-06T09:59:11.280 回答
0

我环顾四周,看看其他人在 gnuplot 中的实时绘图方面做了什么,发现了这个:

http://users.softlab.ntua.gr/~ttsiod/gnuplotStreaming.html

有一个小的 Perl 脚本可以驱动绘图,您只需将信息输入管道即可。

由于您的数据正在写入文件,您可能希望将其传输tail -f yourdata.dat到实时绘图仪中。

此外,因为您正在使用 stdio 文件调用,所以您需要定期刷新(通过调用fflush

显然,您的模拟将在后台或另一个 shell 中运行。这样您就可以随时退出绘图而不会中断模拟。

希望这对你有一些用处。

于 2013-01-14T02:47:19.493 回答
0

有一个广泛的图书馆,称为 DISLIN 用于科学目的。甚至在 Fortran 语言中也可用。

您可以在官方网站上查看示例。

您可以在DISLIN 主页免费获取

于 2020-12-06T20:23:03.210 回答