如何用c程序绘制数据?

问题描述 投票:0回答:8

我是一名机械工程师,对 C 编程知识有限。我编写了一些代码来进行模拟,并且我想可视化模拟结果。目前我正在使用

Dev-C
来编写我的代码。使用
fopen
fprintf
命令,我生成一个包含结果的
.dat
文件。然后我打开
GNUPLOT
程序并导入我的
.dat
文件来绘制结果。这需要时间,我必须等到模拟结束。有没有一种简单的方法可以将我的绘图仪与
Dev-C
连接起来,以便我的绘图仪在模拟过程中开始绘制数据?有图书馆之类的吗?

c graph plot gnuplot simulation
8个回答
21
投票

既然您已经了解 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);

5
投票

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


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/


3
投票

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;
 }

the generated plot

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


1
投票

有一个名为 DISLIN 的广泛图书馆用于科学目的。甚至可以使用 Fortran 语言。

您可以在官网查看示例。

您可以在DISLIN主页

免费获取

0
投票

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

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

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

由于您的数据正在写入文件,您可能需要

tail -f yourdata.dat
并将其通过管道传输到实时绘图仪中。

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

fflush

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

希望对您有用。


0
投票

使用C编程语言绘图的分步解决方案:

第 1 步要求: 1. Windows 10/11 64 位 2. Install eclipse IDE(CDT 或科学计算) 3. 安装 MSYS2 4. Install

mingw64
使用 MSYS2 的 c 编译器所需组件并将其二进制路径添加到windows 环境变量 5. 使用 MSYS2 安装
mathgl
库: Installing mathgl

第 2 步 Crete eclipse 项目女巫包含所需的

mathgl
所需的库。 Create library 将所需的库添加到项目中:

右键单击项目 -> 展开 C/C++ Build -> 设置 -> 展开 MinGW C Linker(如果未展开) -> Libraries -> Libraries (-l) -> add...

这里必须添加

mgl2
mgl2-fltk
library inclution 第3步(最后)编写绘图代码:在项目下创建一个.c文件并写入以下代码。

#include <mgl2/mgl_cf.h>
//#include <mgl2/wnd_cf.h>
#include <mgl2/fltk.h>

#include <synchapi.h>



HMGL gr = NULL;//HMGL mgl_create_graph_fltk

int main(int argc,char **argv)
{

gr = mgl_create_graph_fltk(NULL, "First C graph", NULL, NULL);

double x[50]={0};
HMDT dat=mgl_create_data_size(50, 1, 1);

while(1)
{
    Sleep(100);
    mgl_clf ( gr) ;
    mgl_set_range_val(gr, 'y', -1, 1);
    mgl_set_range_val(gr, 'x', 0, 512);
    mgl_set_origin(gr, 0, 0, 0);
//  mgl_box(gr);
    mgl_axis(gr, "", "", "");
    mgl_set_font_size(gr, 1.5);
//  mgl_grid(gr, a, "", "");




    int i=0;
    while(i<50)
    {
        x[i]=(mgl_rnd()*2)-1;
        i++;
    }

    mgl_data_set_double(dat, x, 50, 1, 1);
//  mgl_line(gr,0,0,0,2*mgl_rnd()-1,2*mgl_rnd()-1,0,"Ar2",-.5);
    mgl_stem(gr, dat, "ro", "");


//   mgl_wnd_update(gr);
}
return 0;
}

构建此代码后,您将在调试文件夹中找到一个可执行文件。


0
投票

James Black 于 2013 年 1 月 14 日撰写的有趣的短代码。只是给定答案的一个想法;

代码引用行:- ”
WriteToFile(pngData, 长度, "plot.png"); ” 添加文件写入位置的路径可以使其更容易查找,例如“C:\users\myFolder\plot.png”。 或者甚至是通过蓝牙或电子邮件发送此图形图像的路径。

© www.soinside.com 2019 - 2024. All rights reserved.