2011-11-28 7 views
6

私はファイルをホストシステムに定期的にログオンするアプリケーションを持っています。このデータを使用して私の統計グラフをプロットしたいと思います。自分のアプリケーションにライブグラフを使用できるかどうかはわかりません。Cアプリケーションのライブグラフ

このツールが正しい場合、外部アプリケーションをライブグラフと統合する例がありますか?

これはlivegraphのリンクです - さて、あなただけlivegraphの与えられたフォーマットでデータを記述する必要があるとあなたが望むものをプロットするようにlivegraph設定>http://www.live-graph.org/download.html

+0

ツールへのリンクはどこですか? – Hossein

+0

どのような統計グラフをプロットしますか? LiveGraphはx/y線グラフのみをサポートしているようですが、正しい形式でファイルに書き込む限り、グラフを表示できるはずです。 – tinman

+0

私はデータロガーファイルを持っています。形式は.txtで、行に数字があります。 (2,4,5,3 10,1など) 私はこのファイルをプログラムで使いたい – ozgur

答えて

1

。もし、乱数を生成し、毎秒の時間とともにそれらを一緒にダンプする小さなCの例を書いてください。次に、ライブグラフプログラムをファイルに添付します。それでおしまい。

LiveGraphで遊んでいると、その使用はかなり制限されていると言わなければなりません。あなたがどのようにプロットされているかをはるかにコントロールできるので、私はまだmatplotlibでpythonスクリプトに固執します。

#include <stdio.h> 
#include <time.h> 
#include <unistd.h> 
#include <gsl/gsl_rng.h> 
#include <gsl/gsl_randist.h> 

int main(int argc, char** argv) 
{ 
     FILE *f; 
     gsl_rng *r = NULL; 
     const gsl_rng_type *T; 
     int seed = 31456; 
     double rndnum; 
     T = gsl_rng_ranlxs2; 
     r = gsl_rng_alloc(T); 
     gsl_rng_set(r, seed); 

     time_t t; 
     t = time(NULL); 



     f = fopen("test.lgdat", "a"); 
     fprintf(f, "##;##\n"); 
     fprintf(f,"@LiveGraph test file.\n"); 
     fprintf(f,"Time;Dataset number\n"); 

     for(;;){ 
       rndnum = gsl_ran_gaussian(r, 1); 
       fprintf(f,"%f;%f\n", (double)t, rndnum); 
       sleep(1); 
       fflush(f); 
       t = time(NULL); 
     } 

     gsl_rng_free(r); 
     return 0; 
} 

私は、これはPythonのプラスmatplotlibを使用して最も簡単に実現することができると思い

gcc -Wall main.c `gsl-config --cflags --libs` 
4

してコンパイルします。これを実現するには実際には複数の方法があります:a)Python InterpreterをCアプリケーションに直接組み込み、b)データをstdoutに出力し、実際のプロットを行う単純なpythonスクリプトにパイプします。以下では、両方のアプローチについて説明します。

次のCアプリケーション(例:plot.c)があります。 Pythonインタプリタを使用してmatplotlibのプロット機能とインターフェースします。アプリケーションはデータを直接プロットすることができ(./plot --plot-dataと呼ばれる)、データをstdout(他の引数セットで呼び出された場合)に出力することができます。あなたはこのようにそれを構築することができ

#include <Python.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 
#include <string.h> 

#define CMD_BUF_SIZE 256 

void initializePlotting() { 
    Py_Initialize(); 
    // load matplotlib for plotting 
    PyRun_SimpleString("from matplotlib import pyplot as pp"); 
    PyRun_SimpleString("pp.ion()"); // use pp.draw() instead of pp.show() 
} 

void uninitializePlotting() { 
    Py_Finalize(); 
} 

void plotPoint2d(double x, double y) { 
    // this buffer will be used later to handle the commands to python 
    static char command[CMD_BUF_SIZE]; 
    snprintf(command, CMD_BUF_SIZE, "pp.plot([%f],[%f],'r.')\npp.draw()", x, y); 
    PyRun_SimpleString(command); 
} 

double myRandom() { 
    double sum = .0; 
    int count = 1e4; 
    int i; 
    for (i = 0; i < count; i++) 
    sum = sum + rand()/(double)RAND_MAX; 
    sum = sum/count; 
    return sum; 
} 

int main (int argc, const char** argv) { 
    bool plot = false; 
    if (argc == 2 && strcmp(argv[1], "--plot-data") == 0) 
    plot = true; 

    if (plot) initializePlotting(); 

    // generate and plot the data 
    int i = 0; 
    for (i = 0; i < 1000; i++) { 
    double x = myRandom(), y = myRandom(); 
    if (plot) plotPoint2d(x,y); 
    else printf("%f %f\n", x, y); 
    } 

    if (plot) uninitializePlotting(); 
    return 0; 
} 

$ gcc plot.c -I /usr/include/python2.7 -l python2.7 -o plot 

など、それを実行します。

$ ./plot --plot-data 

そして、それが軸上に赤い点をプロットするいくつかの時間のために実行されます。

あなたが直接データをプロットするが、stdoutあなたが外部プログラムによるプロットを行うことができます(例えばplot.pyをという名前のPythonスクリプト)stdinから入力を受け取り、すなわちパイプにそれを印刷しないことを選択し、プロットそれが得られるデータ。私は私のDebianマシン上で両方のアプローチをテストしている

from matplotlib import pyplot as pp 
pp.ion() 

while True: 
    # read 2d data point from stdin 
    data = [float(x) for x in raw_input().split()] 
    assert len(data) == 2, "can only plot 2d data!" 
    x,y = data 
    # plot the data 
    pp.plot([x],[y],'r.') 
    pp.draw() 

:これはplot.pyがに似ていると、./plot | python plot.pyのようなプログラムを呼び出す達成するために 。パッケージpython2.7python-matplotlibがインストールされている必要があります。私は、例えば、もちろんこれはmatplotlibのを使用しても可能であり、あなたがバープロットまたはそのようなことをプロットしたかったことを、見てきました

EDIT

ヒストグラム:

from matplotlib import pyplot as pp 
pp.ion() 

values = list() 
while True: 
    data = [float(x) for x in raw_input().split()] 
    values.append(data[0]) 
    pp.clf() 
    pp.hist([values]) 
    pp.draw() 
関連する問題