📄 gnuplot_i.c
字号:
@param d Array of doubles. @param n Number of values in the passed array. @param title Title of the plot. @return void Plots out a 2d graph from a list of doubles. The x-coordinate is the index of the double in the list, the y coordinate is the double in the list. Example: @code gnuplot_ctrl *h ; double d[50] ; int i ; h = gnuplot_init() ; for (i=0 ; i<50 ; i++) { d[i] = (double)(i*i) ; } gnuplot_plot_x(h, d, 50, "parabola") ; sleep(2) ; gnuplot_close(h) ; @endcode *//*--------------------------------------------------------------------------*/void gnuplot_plot_x( gnuplot_ctrl * handle, double * d, int n, char * title){ int i ; int tmpfd ; char name[128] ; char cmd[GP_CMD_SIZE] ; char line[GP_CMD_SIZE] ; if (handle==NULL || d==NULL || (n<1)) return ; /* Open one more temporary file? */ if (handle->ntmp == GP_MAX_TMP_FILES - 1) { fprintf(stderr, "maximum # of temporary files reached (%d): cannot open more", GP_MAX_TMP_FILES) ; return ; } /* Open temporary file for output */ sprintf(name, "%s/gnuplot-i-XXXXXX", P_tmpdir); if ((tmpfd=mkstemp(name))==-1) { fprintf(stderr,"cannot create temporary file: exiting plot") ; return ; } /* Store file name in array for future deletion */ strcpy(handle->to_delete[handle->ntmp], name) ; handle->ntmp ++ ; /* Write data to this file */ for (i=0 ; i<n ; i++) { sprintf(line, "%g\n", d[i]); write(tmpfd, line, strlen(line)); } close(tmpfd) ; /* Command to be sent to gnuplot */ if (handle->nplots > 0) { strcpy(cmd, "replot") ; } else { strcpy(cmd, "plot") ; } if (title == NULL) { sprintf(line, "%s \"%s\" with %s", cmd, name, handle->pstyle) ; } else { sprintf(line, "%s \"%s\" title \"%s\" with %s", cmd, name, title, handle->pstyle) ; } /* send command to gnuplot */ gnuplot_cmd(handle, line) ; handle->nplots++ ; return ;}/*-------------------------------------------------------------------------*//** @brief Plot a 2d graph from a list of points. @param handle Gnuplot session control handle. @param x Pointer to a list of x coordinates. @param y Pointer to a list of y coordinates. @param n Number of doubles in x (assumed the same as in y). @param title Title of the plot. @return void Plots out a 2d graph from a list of points. Provide points through a list of x and a list of y coordinates. Both provided arrays are assumed to contain the same number of values. @code gnuplot_ctrl *h ; double x[50] ; double y[50] ; int i ; h = gnuplot_init() ; for (i=0 ; i<50 ; i++) { x[i] = (double)(i)/10.0 ; y[i] = x[i] * x[i] ; } gnuplot_plot_xy(h, x, y, 50, "parabola") ; sleep(2) ; gnuplot_close(h) ; @endcode *//*--------------------------------------------------------------------------*/void gnuplot_plot_xy( gnuplot_ctrl * handle, double * x, double * y, int n, char * title){ int i ; int tmpfd ; char name[128] ; char cmd[GP_CMD_SIZE] ; char line[GP_CMD_SIZE] ; if (handle==NULL || x==NULL || y==NULL || (n<1)) return ; /* Open one more temporary file? */ if (handle->ntmp == GP_MAX_TMP_FILES - 1) { fprintf(stderr, "maximum # of temporary files reached (%d): cannot open more", GP_MAX_TMP_FILES) ; return ; } /* Open temporary file for output */ sprintf(name, "%s/gnuplot-i-XXXXXX", P_tmpdir); if ((tmpfd=mkstemp(name))==-1) { fprintf(stderr,"cannot create temporary file: exiting plot") ; return ; } /* Store file name in array for future deletion */ strcpy(handle->to_delete[handle->ntmp], name) ; handle->ntmp ++ ; /* Write data to this file */ for (i=0 ; i<n; i++) { sprintf(line, "%g %g\n", x[i], y[i]) ; write(tmpfd, line, strlen(line)); } close(tmpfd) ; /* Command to be sent to gnuplot */ if (handle->nplots > 0) { strcpy(cmd, "replot") ; } else { strcpy(cmd, "plot") ; } if (title == NULL) { sprintf(line, "%s \"%s\" with %s", cmd, name, handle->pstyle) ; } else { sprintf(line, "%s \"%s\" title \"%s\" with %s", cmd, name, title, handle->pstyle) ; } /* send command to gnuplot */ gnuplot_cmd(handle, line) ; handle->nplots++ ; return ;}/*-------------------------------------------------------------------------*//** @brief Open a new session, plot a signal, close the session. @param title Plot title @param style Plot style @param label_x Label for X @param label_y Label for Y @param x Array of X coordinates @param y Array of Y coordinates (can be NULL) @param n Number of values in x and y. @return This function opens a new gnuplot session, plots the provided signal as an X or XY signal depending on a provided y, waits for a carriage return on stdin and closes the session. It is Ok to provide an empty title, empty style, or empty labels for X and Y. Defaults are provided in this case. *//*--------------------------------------------------------------------------*/void gnuplot_plot_once( char * title, char * style, char * label_x, char * label_y, double * x, double * y, int n){ gnuplot_ctrl * handle ; if (x==NULL || n<1) return ; if ((handle = gnuplot_init()) == NULL) return ; if (style!=NULL) { gnuplot_setstyle(handle, style); } else { gnuplot_setstyle(handle, "lines"); } if (label_x!=NULL) { gnuplot_set_xlabel(handle, label_x); } else { gnuplot_set_xlabel(handle, "X"); } if (label_y!=NULL) { gnuplot_set_ylabel(handle, label_y); } else { gnuplot_set_ylabel(handle, "Y"); } if (y==NULL) { gnuplot_plot_x(handle, x, n, title); } else { gnuplot_plot_xy(handle, x, y, n, title); } printf("press ENTER to continue\n"); while (getchar()!='\n') {} gnuplot_close(handle); return ;}/*-------------------------------------------------------------------------*//** @brief Plot a slope on a gnuplot session. @param handle Gnuplot session control handle. @param a Slope. @param b Intercept. @param title Title of the plot. @return void Plot a slope on a gnuplot session. The provided slope has an equation of the form y=ax+b Example: @code gnuplot_ctrl * h ; double a, b ; h = gnuplot_init() ; gnuplot_plot_slope(h, 1.0, 0.0, "unity slope") ; sleep(2) ; gnuplot_close(h) ; @endcode *//*--------------------------------------------------------------------------*/ void gnuplot_plot_slope( gnuplot_ctrl * handle, double a, double b, char * title){ char stitle[GP_TITLE_SIZE] ; char cmd[GP_CMD_SIZE] ; if (title == NULL) { strcpy(stitle, "no title") ; } else { strcpy(stitle, title) ; } if (handle->nplots > 0) { sprintf(cmd, "replot %g * x + %g title \"%s\" with %s", a, b, title, handle->pstyle) ; } else { sprintf(cmd, "plot %g * x + %g title \"%s\" with %s", a, b, title, handle->pstyle) ; } gnuplot_cmd(handle, cmd) ; handle->nplots++ ; return ;}/*-------------------------------------------------------------------------*//** @brief Plot a curve of given equation y=f(x). @param h Gnuplot session control handle. @param equation Equation to plot. @param title Title of the plot. @return void Plots out a curve of given equation. The general form of the equation is y=f(x), you only provide the f(x) side of the equation. Example: @code gnuplot_ctrl *h ; char eq[80] ; h = gnuplot_init() ; strcpy(eq, "sin(x) * cos(2*x)") ; gnuplot_plot_equation(h, eq, "sine wave", normal) ; gnuplot_close(h) ; @endcode *//*--------------------------------------------------------------------------*/void gnuplot_plot_equation( gnuplot_ctrl * h, char * equation, char * title){ char cmd[GP_CMD_SIZE]; char plot_str[GP_EQ_SIZE] ; char title_str[GP_TITLE_SIZE] ; if (title == NULL) { strcpy(title_str, "no title") ; } else { strcpy(title_str, title) ; } if (h->nplots > 0) { strcpy(plot_str, "replot") ; } else { strcpy(plot_str, "plot") ; } sprintf(cmd, "%s %s title \"%s\" with %s", plot_str, equation, title_str, h->pstyle) ; gnuplot_cmd(h, cmd) ; h->nplots++ ; return ;}/* vim: set ts=4 et sw=4 tw=75 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -