viernes, 10 de octubre de 2014

Graficar puntos en Gnuplot desde C


En ocasiones es necesario realizar gráficas de alguna función o simplemente la graficación de puntos. Ésta tarea es simple de realizar desde gnuplot, suponiendo que se use alguna distro de linux. En algunos casos es necesario usar algún programa o software intermedio para realizar dicha gráfica, tal podría ser el caso de realizar un programa en c, y desde ahí generar los puntos y automáticamente graficarlos.
Cuando es la primera vez que se hace esto es un poco complicado. Aquí les traigo un ejemplo para ir comenzando con esto:
/*http://umencs.blogspot.mx/2013/05/plotting-creating-graphs-in-c-c.html File Name: GraphPlotting.c*/
/*
 * Autor: gXfer
 * Nombre del archivo: graficarGnuplotDesdeC.c
 * Descripción: Grafica en gnuplot los puntos ordeandos e inicializados 
 * en los arreglos (valoresX, valoresY)
 * 10-octubre-2014*/

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define NUM_PUNTOS 11
#define NUM_COMANDOS 4

int main(){
    // X, Y valores de los puntos a graficar
    double valoresX[NUM_PUNTOS] = {0.0, 1.0, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0};
    double valoresY[NUM_PUNTOS] = {4.0, 4.0, 0.0, 1.0, 0.0, 1.5, 0.0, 1.0, 0.0, 0.5, 0.0};
    register int i=0;
    /* se crea y se abre el archivo puntosGraficar.txt en modo escritura 
     * para almacenar los valores de x y y que están declarados en los arreglos
     * valoresX y valoresY*/
    FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");

    /*Guardar los puntos x,y en el archivo de texto creado y abierto previamente*/
    for (i=0;i<NUM_PUNTOS;i+ +){
  fprintf(archivoPuntos, "%lf %lf \n", valoresX[i], valoresY[i]);
 }
 
    /*lista de comandos para ejecutar y configurar la visualización que tendrán
     * los puntos en la gráfica con gnuplot*/
    char * configGnuplot[] = {"set title \"gXfer Graficando puntos - unir con líneas\"", 
                                "set ylabel \"----grado de membresía--->\"",
                                "set xlabel \"----Universo X--->\"",
                                "plot \"puntosGraficar.txt\" using 1:2 with lines"
                               };

    /*Se crea una archivo de tipo poen, es una tebería IPC que se usa, para
     * ejecutar gnuplot y enviarle el archivo a graficar*/
    FILE * ventanaGnuplot = popen ("gnuplot -persist", "w");
    // Executing gnuplot commands one by one
    for (i=0;i<NUM_COMANDOS;i+ +){
  fprintf(ventanaGnuplot, "%s \n", configGnuplot[i]);
 }
 fclose(archivoPuntos);
    return 0;
}

Si usas geany para compilar y ejecutar tus códigos en C, es necesario hacer las siguientes configuraciones: 
Ir a la opción construir y seleccionar de la lista desplegable la opción que dice "Establecer comandos de construcción" como se muestra en la siguiente imagen.

Abrirá una ventana como se muestra en la imagen de abajo, en la opción que dice "Compilar" deben agregar la sintaxis "-lm" sin comillas, lo mismo deben de hacer en la línea de que dice "Construir", agregar "-lm" sin comillas. y listo, le dan en aceptar y pueden compilar como normalmente lo hace.


Para compilar: ir al directorio que ha sido guardado previamente:
gcc -Wall graficarGnuplotDesdeC.c -lm -o graficarGnuplotDesdeC
Para ejecutar el resultado introduce en la línea de comandos:
./graficarGnuplotDesdeC.c

La salida es la siguiente:



Si tienen dudas no olviden comentar.


4 comentarios:

  1. Wow!!!!!!
    Maravilloso! Funciono asombrosamente, no sabes cuanto tuve que buscar hasta llegar a tu post! Casi me arranco los cabellos de que no sabía como usarlo pero gracias a ti ya todo quedo claro!

    ResponderEliminar
  2. Gracias Fernando por el aporte excelente, un código sencillo y legible para comprender rápidamente el funcionamiento de gnuplot con C++. Felicitaciones.

    ResponderEliminar
    Respuestas
    1. Gracias por comentar.

      De nada, es un placer compartir conocimiento.

      Eliminar