2010-08-19 54 views
16

我已經編寫了一個程序,該程序將數據列表寫入'.dat'文件,然後打算使用gnuplot單獨繪製它。有沒有辦法讓我的代碼自動繪製它?我的輸出是下面的形式:使C代碼自動繪製一個圖形

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

理想地,當我運行代碼的曲線也將印有一個X標籤,γ-標籤和標題(其可以從我的C代碼改變)。非常感謝。

+1

也許檢查出'system'功能。 – sje397 2010-08-19 11:23:28

回答

32

我在搜索關於gnuplot的其他內容時遇到了這個問題。儘管這是一個老問題,但我認爲我會提供一些示例代碼。我將它用於我的一個程序,我認爲它的工作非常乾淨。 AFAIK,這個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; 
} 

編輯

在我的申請,我也碰到了,該地塊沒有出現,直到調用程序被關閉的問題。要解決此問題,請在使用fprintf向您發送最終命令後添加fflush(gnuplotPipe)

我也看到,Windows用戶可能會使用_popen來代替popen - 但我無法確認這一點,因爲我沒有安裝Windows。

編輯2

一種可避免具有通過發送gnuplot的所述plot '-'命令,隨後的數據點後面跟有字母「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"); 
+0

我知道自從這個答案發布以來它已經很長時間了,但是我使用了第二次編輯的代碼加上帶有'commandsForGnuplot'的for循環來添加命令,但它並沒有添加任何命令(標題,xlabel或ylabel)。如果不是這樣,我該如何添加它們?請。 – 2017-09-22 19:34:55

5

您可以創建一個gnuplot腳本並生成一個運行gnuplot的進程來從命令行繪製該腳本,也可以使用其中一個提供的接口。對於C,有來自薩科Devillard這裏提供一個基於POSIX管道接口: http://ndevilla.free.fr/gnuplot/ ...和基於iostream的-C++版本通過git的可用(參見:http://www.stahlke.org/dan/gnuplot-iostream/

最輕便和可能是最簡單儘管如此,仍然會調用gnuplot來繪製腳本。如上所述,請查看stdlib.h中system()調用的文檔。

在旁註中,還有GNU plotutils,它提供libplot,一個用於繪製數據集的庫,可以在您的應用程序中使用它。參見:http://www.gnu.org/software/plotutils/

+1

我不是很瞭解所有這些文檔的東西,但我發現system()的聲明: int system(const char * command); 然後只是添加類似這樣的一個例子: 系統(gnuplot plot「data_set.dat」with 1:2 using lines); – JMzance 2010-08-19 11:54:13

+1

最後我去了這樣的: – JMzance 2010-09-23 11:56:18

+1

#include「gnuplot_i.h」 int main(void) { FILE * outFile; outFile = fopen(「Flight_Path.dat」,「w」); *輸出文件的迭代循環:example.dat */ fclose(outFile); gnuplot_ctrl * k; k = gnuplot_init(); gnuplot_set_xlabel(k,「x」); gnuplot_set_ylabel(k,「y」); gnuplot_cmd(k,input_x); gnuplot_cmd(k,input_y); gnuplot_cmd(k,「set title \」Trajectory with Drag \「」); gnuplot_cmd(K, 「情節\」 Flight_Path.dat \」使用1:2標題\ 「飛行路徑\」 用線,\ 睡眠(7); gnuplot_close(K); 返回0; } – JMzance 2010-09-23 12:00:06

2

雖然我已經看到了很多這樣的方式,這樣做的最簡單的方法是通過使用系統()(stdlib.h中)在C函數 首先做出的gnuplot腳本並將其保存爲「name.gp」(既不是名稱也不是擴展名)。
一個簡單的腳本是,

plot 'Output.dat' with lines 

保存這個腳本文件後,只需
system("gnuplot -p 'name.gp'");
在你的代碼的末尾。
就這麼簡單。

0

我已經調整了接受的答案來繪製浮點數組,同時避免使用臨時文件。其中,float* data_是數組,size_t size_是它的大小。希望對某人有幫助!

乾杯,
安德烈斯

void plot(const char* name="FloatSignal"){ 
    // open persistent gnuplot window 
    FILE* gnuplot_pipe = popen ("gnuplot -persistent", "w"); 
    // basic settings 
    fprintf(gnuplot_pipe, "set title '%s'\n", name); 
    // fill it with data 
    fprintf(gnuplot_pipe, "plot '-'\n"); 
    for(size_t i=0; i<size_; ++i){ 
    fprintf(gnuplot_pipe, "%zu %f\n", i, data_[i]); 
    } 
    fprintf(gnuplot_pipe, "e\n"); 
    // refresh can probably be omitted 
    fprintf(gnuplot_pipe, "refresh\n"); 
}