17

データのリストを「.dat」ファイルに書き込むプログラムを作成しました。これは、gnuplotを使用して個別にプロットすることを目的としています。コードに自動的にプロットさせる方法はありますか?私の出力は次の形式です。

x-coord    analytic    approximation
x-coord    analytic    approximation
x-coord    analytic    approximation
x-coord    analytic    approximation
x-coord    analytic    approximation
 ....

理想的には、コードを実行すると、グラフはxラベル、yラベル、およびタイトル(Cコードから変更される可能性があります)で印刷されます。どうもありがとう。

4

5 に答える 5

46

gnuplot に関する何か他のものを探しているときに、これに出くわしました。古い質問ですが、サンプルコードを提供したいと思いました。私はこれを私のプログラムに使用していますが、かなりきちんとした仕事をしていると思います。私の知る限り、この PIPEing は Unix システムでのみ機能します (Windows ユーザーについては、以下の編集を参照してください)。私の gnuplot インストールは、Ubuntu リポジトリからのデフォルトのインストールです。

#include <stdlib.h>
#include <stdio.h>
#define NUM_POINTS 5
#define NUM_COMMANDS 2

int main()
{
    char * commandsForGnuplot[] = {"set title \"TITLEEEEE\"", "plot 'data.temp'"};
    double xvals[NUM_POINTS] = {1.0, 2.0, 3.0, 4.0, 5.0};
    double yvals[NUM_POINTS] = {5.0 ,3.0, 1.0, 3.0, 5.0};
    FILE * temp = fopen("data.temp", "w");
    /*Opens an interface that one can use to send commands as if they were typing into the
     *     gnuplot command line.  "The -persistent" keeps the plot open even after your
     *     C program terminates.
     */
    FILE * gnuplotPipe = popen ("gnuplot -persistent", "w");
    int i;
    for (i=0; i < NUM_POINTS; i++)
    {
    fprintf(temp, "%lf %lf \n", xvals[i], yvals[i]); //Write the data to a temporary file
    }

    for (i=0; i < NUM_COMMANDS; i++)
    {
    fprintf(gnuplotPipe, "%s \n", commandsForGnuplot[i]); //Send commands to gnuplot one by one.
    }
    return 0;
}

編集

私のアプリケーションでは、呼び出し元のプログラムが閉じられるまでプロットが表示されないという問題にも遭遇しました。これを回避するには、最終コマンドの送信に fflush(gnuplotPipe)使用した後に a を追加します。fprintf

また、Windows ユーザーが--_popenの代わりに使用する可能性があるpopenことも確認しましたが、Windows をインストールしていないため確認できません。

編集2

plot '-'gnuplot にコマンド、データポイント、文字 "e" を送信することで、ファイルへの書き込みを回避できます。

例えば

fprintf(gnuplotPipe, "plot '-' \n");
int i;

for (int i = 0; i < NUM_POINTS; i++)
{
  fprintf(gnuplotPipe, "%lf %lf\n", xvals[i], yvals[i]);
}

fprintf(gnuplotPipe, "e");
于 2011-08-03T23:05:29.187 に答える
6

gnuplotスクリプトを作成し、gnuplotを実行するプロセスを生成して、コマンドラインからこのスクリプトをプロットするか、提供されているインターフェイスの1つを使用することができます。Cの場合、Nicolas DevillardのPOSIXパイプベースのインターフェイスが http://ndevilla.free.fr/gnuplot/で利用可能で あり、iostreamベースのC ++バージョンがgit経由で利用可能です(http://を参照)。 www.stahlke.org/dan/gnuplot-iostream/

ただし、最も移植性が高く、おそらく最も簡単な方法は、gnuplotを呼び出してスクリプトをプロットすることです。sje397が述べたように、stdlib.hのsystem()コールのドキュメントを確認してください。

補足として、GNU plotutilsもあります。これは、アプリケーションで使用できるデータセットをプロットするためのライブラリであるlibplotを提供します。参照:http ://www.gnu.org/software/plotutils/

于 2010-08-19T11:48:58.957 に答える
3

これを行う多くの方法を見てきましたが、これを行う最も簡単な方法は、C で system() (stdlib.h から) 関数を使用することです。最初に gnuplot スクリプトを作成し、「name. gp" (名前も拡張子も関係ありません)。
簡単なスクリプトは次のようになります。

plot 'Output.dat' with lines

このスクリプト ファイルを保存した後
system("gnuplot -p name.gp");
、コードの最後に追加するだけです。
それはそれと同じくらい簡単です。

gnuplot パスを Windows システム パス変数に必ず追加してください。

于 2015-09-03T14:59:38.043 に答える