miércoles, 15 de octubre de 2008

Dibujando gráficas en 2 patadas con CGN

Hola:

Sí, el título podía ser más formal, pero hoy nos interesa ir deprisa...

Vamos a aprender a dibujar gráficas en Gnuplot desde lisp. Gnuplot es un conocido programa para dibujar gráficas de funciones y puntos (las últimas versiones hacen más cosas, como por ejemplo histogramas) que seguramente ya conoceréis. Así que manos a la obra!

Existen muchas alternativas en lo que a controlar gnuplot desde lisp se refiere. En cliki podéis encontrarlas. Aquí me limitaré a enseñaros a dibujar con CGN. ¿ Por qué CGN? Pues porque soy su autor, así que es la librería que mejor conozco y la que suelo usar, aunque no la mejor. Os invito a que probéis el resto y me contéis cómo ha sido la experiencia. Podemos publicarlo en este blog para ayudar a más gente.

¿Cómo instalaremos CGN? Pues de la manera que os imagináis: 

(asdf-install:install 'cgn )

CGN depende de la librería gráfica LTK, así que asdf-install la instalará por vosotros. Ahora bien, para este tutorial os recomiendo usar la versión que se halla en el repositorio darcs,  que se debe instalar a mano. La función plot2d que usaremos aquí sólo se encuentra en esa versión. Lo siento, todavía no he lanzado una release actualizada.

Dibujando con plot2d:

Para empezar a dibujar con CGN sólo hay que saber usar 2 cosas: la macro with-gnuplot y la función plot2d. 

Empecemos por la macro: para dibujar con CGN hay que escribir el código dentro de la macro 

(with-gnuplot () 

;;Código aquí

)

No nos interesa ahora lo que podemos ponerle como argumento. ¡Queremos empezar a dibujar, ya! Pues bien: aquí está lo más sencillo y útil que le podemos poner como argumento: plot2d.

Plot2d es una función que pretende ofrecer la funcionalidad que proporciona el comando del mismo nombre en Maxima.  Su sintaxis básica es :

(plot2d quePlotear rangoX &rest opciones )

rangoX ha de ser una lista con el formato ( 'x xminimo xmaximo ). quePlotear puede ser muchas cosas: un string ( "sin(x)" ) , una función ( #'cos ) , una lambda function, una lista de puntos o una lista conteniendo todo lo anterior. De las opciones no hablaremos de momento, hay prisa!

Por ejemplo, mostramos el seno:

(with-gnuplot () 
  (cgn::plot2d "sin(x)" '(x 0 10 ) ) )















Si le pasamos una función, CGN la dibujará en los puntos que crea necesario:

(with-gnuplot ()
  (cgn::plot2d #'cos '(x 0 10 ) ) )
















Otra opción es hacer un gráfico de puntos:

(with-gnuplot ()
  (cgn::plot2d '(discrete (1 2 3 4 5 6 7 8 9 10 ) (1.1 2.5 4.21 2.12 3.15 4.57 6.87 8.74 12.5 13.4789 ) ) '(x 0 10 ) ) 
)

















Podéis ver una muestra de lo que plot2d puede hacer ejecutando (cgn::plot2d-test). En el manual en pdf que se incluye en la versión de desarrollo se explica todo.

La forma rápida y simple

Existe una forma para que hasta un niño pueda hacer gráficas en CGN. Consiste en usar  el easy-plotter. Easy-plotter es una interfaz gráfica escrita en ltk para la macro plot (sí, esto también es una novedad de la versión del repositorio) que nos permite escribir simplemente la función que usaremos y plotearla. Lamentablemente, no sirve para plotear funciones de lisp ni lambda functions, pero es muy sencilla de usar:

(cgn::easy-plotter)



Parece sencillo, ¿verdad? Probadlo. CGN puede hacer muchas más cosas, pero me tengo que ir a clase, así que no hay tiempo para contarlas. Espero que esto os haya resultado útil. Ah! Por favor, la versión del repositorio está todavía en desarrollo, así que no seáis muy crueles con los fallos que encontréis. ¡Adiós!

No hay comentarios: