data_plotting.mws

Graficando datos con Maple

Los datos deben ser leidos con el comando "readdata".  Si estamos trabajando en una maquina bajo Unix, Windows o Mac el formato de lectura cambia ligeramente. Aqui se escriben algunos ejemplos que muestran la manera correcta para especificar el camino en donde esta ubicado el archivo datos.txt

 > data:=readdata(`MacHD:cpug:datos:datos.txt`,numcols):   => Mac

  > data:=readdata(`c:/cpug/datos/datos.txt`,numcols):              =>  Windows

  > data:=readdata(`/home/hector/datos/datos.txt`,numcols):    =>  Unix

El segundo argumento  de "readdata" es el numero de columnas que se quiere  leer. Los datos son leido como una lista de listas de la forma

              [[fila 1  dato1],[fila 2  dato2], ..., [fila_n  dato_n]],

donde cada fila es a la vez una lista

dato_n =>    [valor1,valor2, ..., valor_numcols].

Mas informacion puede obtenerse al escribir:

  >?readdata

En este primer ejemplo se tiene un archivo de datos llamado datos01.txt , que contiene 2 columnas con 101 filas. Las primeras dos lineas y las ultimas dos lineas de este archivo son:

         0      0.3528340285
         0.1    0.3618782685
          :                 :

          :                 :
          .                 .

         9.9   0.01904239283
         10
 0.01334321559

>    restart:

>    numcols:=2:

>    datos1:=readdata(`/home/hector/datos/datos01.txt`,numcols):

Se puede pedir que se muestre algunos de los elementos de la lista anterior

>    datos1[1];datos1[50];datos1[101];

[0., .3528340285]

[4.9, -.9156689711e-1]

[10., .1334321559e-1]

Es necesario convertir los datos en un arreglo de dimensiones [numfils x numcols], con ayuda del comando "nops" (numero de operandos) se puede hacer de la manera siguiente

>    numfils:=nops(datos1);

numfils := 101

>    A:=array(1..numfils,datos1):

>    plot(A,title=`Ejemplo 1`,titlefont=[HELVETICA,18],labels=[x,y],labelfont=[HELVETICA,16],axesfont=[HELVETICA,14],tickmarks=[4,4]);

[Maple Plot]

En el siguiente ejemplo el archivo datos02.txt es un archivo que contiene 51 columnas y 101 filas. Las primeras dos lineas y las ultimas dos lineas de este archivo son:

      0.0  92.92035398230088 . . . . . 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0  92.92035398230088 0.0
      0.0  14.89949861693958 . . . . . 54.734818015084606  42.681775294291434  29.281398898890416  14.89949861693958 0.0
                         :                                                      :                                                         :

                         :                                                      :                                                         :       
      0.0  0.031604239614923056 . . . . .  0.0943143011065842  0.06308375173468966  0.031604239614923056 0.0
     0.0  0.029886390566035575 . . . . .  0.08918784546561599  0.05965483320230009  0.029886390566035575 0.0

De manera general, es un archivo que puede  tener  la siguiente estructura para representar una funcion z=f(x,y)

                                            |   y0      y1     y2  . . . . . . .   yn

                                       - - |--------------------------------

                                      x0  |  z00   z01    z02 . . . . . . . z0n

                                      x1  |  z10   z11    z12 . . . . . . . z1n

                                       :    |      :       :        :                  :

                                     xm  |  zm0  zm1   zm2 . . .  . .   zmn

pero que no continene de manera esplicita los valores de las variables x  y y , es decir es un arreglo que contiene solo los valores de z.

>    restart:with(plots):with(linalg):

Warning, the name changecoords has been redefined

Warning, the protected names norm and trace have been redefined and unprotected

>    numcols:=51:

>    datos2:=readdata(`/home/hector/datos/datos02.txt`,numcols):

>    datos2[1];

[0., 92.92035398, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 1...
[0., 92.92035398, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 1...

>    numfils:=nops(datos2);

numfils := 101

En la siguiente instrucción se construye un arreglo de [numfils x numcols] elementos

>    B:=array(1..numfils,1..numcols,datos2):

Si se quiere ver alguno de estos elementos se escribe:

>    B[1,50];

92.92035398

Una vez contruido el arreglo, es posible hacer directamente un plot 3D con el comando "matrixplot"

>    matrixplot(B,axes=boxed,labels=[x,y,z],style=patchcontour,labelfont=[HELVETICA,14],axesfont=[HELVETICA,9],tickmarks=[5,5,5],title=`Ejemplo 2`,titlefont=[HELVETICA,18],orientation=[-70,70]);

[Maple Plot]

El comando "matrixplot" funciona considerando que el espaciamiento de la malla de puntos es uniforme. De no ser asi, es necesario conocer como es el espaciamiento de la malla o incluir los valores x  y y   junto con los valores de z en el archivo de datos. Se puede hacer uso del comando "surfdata" para graficar la superficie utilizando los datos completos x,y,z .

Para contruir una malla uniforme que contenga la lista de listas de puntos  x,y,z  de manera completa se puede utilizar el comando "seq" para hacer una sucesión de elementos, como se muestra  a continuación:

>    lista_datos:=[seq([seq([i,j,B[i,j]], j=1..numcols) ], i=1..numfils)]:

>    lista_datos[1];

[[1, 1, 0.], [1, 2, 92.92035398], [1, 3, 100.0], [1, 4, 100.0], [1, 5, 100.0], [1, 6, 100.0], [1, 7, 100.0], [1, 8, 100.0], [1, 9, 100.0], [1, 10, 100.0], [1, 11, 100.0], [1, 12, 100.0], [1, 13, 100.0]...
[[1, 1, 0.], [1, 2, 92.92035398], [1, 3, 100.0], [1, 4, 100.0], [1, 5, 100.0], [1, 6, 100.0], [1, 7, 100.0], [1, 8, 100.0], [1, 9, 100.0], [1, 10, 100.0], [1, 11, 100.0], [1, 12, 100.0], [1, 13, 100.0]...
[[1, 1, 0.], [1, 2, 92.92035398], [1, 3, 100.0], [1, 4, 100.0], [1, 5, 100.0], [1, 6, 100.0], [1, 7, 100.0], [1, 8, 100.0], [1, 9, 100.0], [1, 10, 100.0], [1, 11, 100.0], [1, 12, 100.0], [1, 13, 100.0]...
[[1, 1, 0.], [1, 2, 92.92035398], [1, 3, 100.0], [1, 4, 100.0], [1, 5, 100.0], [1, 6, 100.0], [1, 7, 100.0], [1, 8, 100.0], [1, 9, 100.0], [1, 10, 100.0], [1, 11, 100.0], [1, 12, 100.0], [1, 13, 100.0]...

Se puede ver que el primer item de esta lista  es [1,1,0] y es una lista de puntos que corresponden al primer valor de la variable x, es decir,  es una lista de la forma [x0,y0,z00].  El siguiente es [x0,y1,z01],  y asi sucesivamente. Y ahora la grafica,

>    surfdata(lista_datos,labels=[x,y,z],axes=boxed,style=patchcontour,labelfont=[HELVETICA,14],axesfont=[HELVETICA,9],tickmarks=[5,5,5],title=`Ejemplo 2b`,titlefont=[HELVETICA,18],orientation=[-70,70]);

[Maple Plot]

Si el archivo de datos es de la forma

         x0  y0    z00

         x0  y1    z01

          :      :         :

         x1  y0    z10

         x1  y1    z11

          :      :         :

        xm  yn   zmn

es decir, contiene de manera explicita los valores de x  y y  se debe proceder como se muestra a continuacion:

>    datos3:=readdata(`/home/hector/datos/datos03.txt`,3):

>    datos3[1];datos3[5005];

[1., 0., 0.]

[19600., 6., .1959376667]

Los datos, tal como estan, no pueden ser operados con el comando "surfdata" ya que son una lista de puntos y no una lista de listas de puntos. Es necesario entonces construir la lista de listas con el comando "seq",

>    C:=[seq([seq(datos3[(i-1)*numcols+j],j=1..numcols)],i=1..numfils)]:

Ahora tenemos los datos como en el ejemplo anterior.

>    C[1];

[[1., 0., 0.], [1., 1., 92.92035398], [1., 2., 100.0], [1., 3., 100.0], [1., 4., 100.0], [1., 5., 100.0], [1., 6., 100.0], [1., 7., 100.0], [1., 8., 100.0], [1., 9., 100.0], [1., 10., 100.0], [1., 11.,...
[[1., 0., 0.], [1., 1., 92.92035398], [1., 2., 100.0], [1., 3., 100.0], [1., 4., 100.0], [1., 5., 100.0], [1., 6., 100.0], [1., 7., 100.0], [1., 8., 100.0], [1., 9., 100.0], [1., 10., 100.0], [1., 11.,...
[[1., 0., 0.], [1., 1., 92.92035398], [1., 2., 100.0], [1., 3., 100.0], [1., 4., 100.0], [1., 5., 100.0], [1., 6., 100.0], [1., 7., 100.0], [1., 8., 100.0], [1., 9., 100.0], [1., 10., 100.0], [1., 11.,...
[[1., 0., 0.], [1., 1., 92.92035398], [1., 2., 100.0], [1., 3., 100.0], [1., 4., 100.0], [1., 5., 100.0], [1., 6., 100.0], [1., 7., 100.0], [1., 8., 100.0], [1., 9., 100.0], [1., 10., 100.0], [1., 11.,...
[[1., 0., 0.], [1., 1., 92.92035398], [1., 2., 100.0], [1., 3., 100.0], [1., 4., 100.0], [1., 5., 100.0], [1., 6., 100.0], [1., 7., 100.0], [1., 8., 100.0], [1., 9., 100.0], [1., 10., 100.0], [1., 11.,...

>    surfdata(C,labels=[x,y,z],axes=boxed,style=patchcontour,labelfont=[HELVETICA,14],axesfont=[HELVETICA,9],tickmarks=[5,5,5],title=`Ejemplo 3`,titlefont=[HELVETICA,18],orientation=[-70,70]);

[Maple Plot]

FIN.

>