Jul 03 2010

Org-mode : Graficas / trazas (plot)

Tag: basicoverdrive @ 3:21 am

En el articulo anterior referente a spreadsheet u hojas de calculo, explicamos como es posible realizar hojas de calculo mediante org-mode de GNU/emacs. Como bien muchos saben, estas las hojas de calculo son datos tabulados en los que se pueden incluir referencias y demas, por lo que este software generalmente incluye lo que se llama plotting o traza de estos datos, o lo que es lo mismo realizar graficas haciendo uso de estos datos. GNU/emacs no es para menos, y tambien permite realizar lo mismo. He preferido separarlo en dos articulos (aunque este segundo me ha quedado algo corto), ya que en muchos casos no estamos para nada interesados en esta funcionalidad, pero si creo que es un aditivo a la funcionalidad anterior y esta estrechamente relacionada.

Plot

Se puede producir graficos en 2D y 3D mediante gnuplot, lo cual requiere de tener gnuplot y gnuplot-mode instalado. Se debe agregar a la primera linea de la tabla algo tal que asi (por ejemplo):

#+PLOT: title:»foobar» ind:1 deps:(3) type:2d with:histograms set:»yrang [0:]».

Existen otras funciones para plot tal que:

set: especifica cualquier opcion de gnuplot a ser modificada.
title: espeficia el titulo del ploteado.
ind: especifica que columna de la tabla usara el eje de las x.
deps: especifica las columnas a ser ploteadas.
type: especifica el tipo de ploteado, 2d, 3d o grid.
with: Especifica cada opcion a ser insertada (lines, points, boxes, impulses, etc).
file: especifica un fichero de salida para el ploteado.
labels: lista de etiquetas a ser usadas para las deps.
line: especifica una linea entera a ser insertada en el script de gnuplot.
map: Cuando dibuja en 3D o tipo, activa los mapas para ir mas alla de 3d slope.
timefmt: Especifica el formato de timestams.
script: control total especificando un fichero de script. Especificado por $datafile.

Los resultados son excepcionales, podeis probarlos, podeis encontrar mas informacion dedicada al tema en: http://cars9.uchicago.edu/~ravel/software/gnuplot-mode.html tambien podeis encontrar informacion interesante sobre gnuplot en su web oficial.


Jul 03 2010

Org-mode : spreadsheet (hojas de calculo)

Tag: basicoverdrive @ 3:01 am

Y aqui estamos con un nuevo articulo sobre org-mode, como no, org-mode permite la creacion y uso de hojas de calculo (en ingles spreadsheet). Parece increible como un software que a simple vista parece tan simple, pueda llegar a tener tanta potencia, todo esto no seria posible sin el magnifico grupo de desarrolladores de org-mode y en general a la comunidad tan activa de GNU/emacs, sin mas dilacion comenzamos explicando el uso de referencias.

Antes de comenzar, debe conocer un minimo el uso de tablas en org-mode, ya que las hojas de calculo se emplean mediante dicho uso, por lo que es necesario leer el articulo sobre Org-mode: tablas para poder aplicar luego hojas de calculo sobre el.

Referencias

Se puede referenciar un campo para computarlo con otros. Se puede referenciar dado su nombre, sus coordenadas absolutas o coordenadas relativas. Para saber las corrdenadas de un campo debemos presionar C-c ? que mostrar las coordenadas de dicho campo o bien C-c } que hara toggle de las coordenadas del grid.

La notacion que usa org es @fila$columna, si es relativa debemos anadir + o delante del numero. Tambien se puede especificar ‘I‘ para referirse a la primera linea, ‘II‘ a la segunda linea, ‘-I‘ a la (n)anterior linea o bien ‘III+2‘ para referirse al segundo dato de la tercera linea de la tabla. 0 se referira a la columna y fila actual.

Existen referencias especiales como ‘$LR5‘ que pueden ser usadas para referirse al 5o campo de la ultma fila de la tabla.

@2$3 -> 2a fila, 3a columna
C2 -> igual que la anterior columna
$5 -> 5a columna en la fila actual
E& -> igual que la anterior
@2 -> columna actual, 2a fila
@-1$-3 -> una fila mas arriba, tres columnas mas a la derecha
@-I$2 -> encima de la fila actual, columna 2

Rangos

$1..$3 -> Los primeros 3 campos de la fila actual
$P..$Q -> rango usando nombres de columnas P y Q
@2$1..@4$3 -> 6 campos entre estos dos campos, dando rutas relativas
A2..C4 -> 6 campos entre estos dos campos, dando rutas absolutas
@-1$-2..@-1 -> 3 numeros de la columna a la derecha, 2 arriba de la fila actual.

Referencias con nombre

Se puede asignar un nombre a una referencia mediante la variable org-table-formula-constants, o localmente mediante el fichero de configuracion:

#+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6

Es posible usar referencias remotas mediante:

remote(NAME-OR-ID,REF)

Donde nombre es el nombre de la tabla dado por #+TBLNAME: NAME o su ID. REF es la direccion absoluta o rango de referencias valido en la tabla.

Las formulas pueden ser usadas como expresiones algebraicas mediante el paquete calc de emacs (importante saber que usa convencion no estandar donde / tiene menos precedencia que *) mediante la funcion calc-eval se puede realizar esta evaluacion.

Mediante org-calc-default-modes se usara el modo standard de calc (precision 12, unidades angulares graduales, fracciones y los modos simbolicos deshabilitados).

p20 -> cambia la precision interna a 20 digitos
n3 s3 e4 f4 -> normal, cientifica, ingeniero o formato fijo
D R -> gradianes o radiales (angulo)
F S -> fraccion y simbolicos
N -> interpreta todos los campos como numeros, y usa 0 para los campos que no tengan numeros.
T -> fuerza la intepretacion del texto
E -> mantiene campos vacios en rangos

Ademas se puede usar printf como especificador de formato para reformatear el resultado final:

$1+$2 : suma el primero y el segundo campo
$1+$2;%.2f : suma los dos primeros campos usando 2 decimales
exp($2)+exp($1) : funciones matematicas
$0;%.1f : reformatea la celda actual a un decimal
($3-32)*5/9 : Conversion de grados Farenheit a Celsius
$c/$1/$cm : Conversion de Hz a cm
tan($1);Dp3s1 : computa en grados, precision 3, mostrando SCI 1
sin($1);Dp3%.le : usa el especificador printf para mostrar
vmean($2..$7) : computa un rango de columnas, usando un vector de funciones
vmean($2..$7);EN : igual, pero usa los campos vacios como 0
taylor($3,x=7,2) : serie de taylor de $3, en x=7, segundo grado.

Tambien se pueden contener expresiones logicas tales como:

if($1<20,teen,string(«»)) : teen, si la edad de $1 es menor que 20, en cualquier otro caso vacio.

Si lo que queremos es usar mas potencia podemos escribir formulas para la manipulacion de cadenas y el control de estrucutras tales como:

Intercambia los primeros dos caracteres de la columna 1:
‘(concat (substring $1 1 2) (substring $1 0 1) (substring $1 2))

Suma columnas 1 y 2, equivalnete a calc $1 y $2:
‘(+ $1 $2);N

Calcula la suma de las columnas 1 a 4:
‘(apply ‘+ ‘($1..$4));N

Para asignar una formula a un campo en particular, debe ir precedido por «:=«. Las formulas son guardadas en el formato especial con #+TBLFM: directamente debajo de la tabla. Ademas debemos usar el comando C-u C-c = si queremos insertar una nueva formula en el campo actual.

Es frecuente usar la misma formula para todos los campos de una columna, esto es posible mediante TAB, INTRO o C-c C-c para pasar guardar la formula en la columna usada. Una vez se sale a la siguiente fila tan solo debemos pulsar C-c =, e insertara la nueva formula en la columna actual, reemplazandola por el resultado, tambien es posible usar prefijos para aplicarlo en muchas celdas consecutivas de la columna actual.

Para editar y depurar (o debuggear) existe:

  • C-c = ó C-u C-c = : Edita una formula asociada con el campo/columna actual en el minibuffer.
  • C-u C-u C-c = : reinserta una formula activa en el campo actual. Ademas la ventaja de usar el minibuffer es que se puede emplear el comando C-c ?
  • C-c ? : Resalta el campo referenciado por la posicion del cursor en una formula.
  • C-c } : Muestra (toggle) los numeros de una fila y columna para una tabla, usando overlays. Con C-c C-c se puede formar la alineacion de la tabla cada vez.
  • C-c { : Hace toggle del debugger de formula.
  • C-c ‘ : Edita todas las formulas de la tabla actual en un buffer especial.
  • C-c C-c ó C-x C-s : Sale del editor de formulas
  • C-c C-q : Sale del editor de formula sin instalar los cambios.
  • C-c C-r : Hace toggle del editor de formulas para todas las referencias entre standard (B3, etc) e internas (@3$2, etc).
  • TAB : Hace impresion ‘bonita’, idnetando las formulas lisp, etc.
  • M-TAB : Completa los simbolos lisp.
  • S-up/down/left/right (tecla super + flechas) : Desplaza el punto de referencia.
  • M-S-up/down : Mueve la linea de test para formulas en columnas en el bufer de org.
  • M-up/down : Desplaza la ventana
  • C-c } : Muestra las coordenadas del grid de la tabla.

Cuando se evalua una forma que contiene errores se mostrara la cadena ‘#ERROR‘ para conocer que ocurrio en la substitucion de variables y calculos se puede emplear C-u C-u C-c = INTRO.

Para actualizar la tabla se pueden emplear los siguientes comandos:

  • C-c * : Recalcula la fila actual
  • C-u C-c * ó C-u C-c C-c : recalcula la tabla entera
  • C-u C-u C-c * ó C-u C-u C-c C-c : Itera la tabla para recalcularla hasta que los cambios ocurran.

Existen otras funciones avanzadas con tablas como:

  • C-# : rota la marca de calculos en la primera columa para los estados, ‘#‘, ‘*‘, ‘!‘, ‘$‘. Tambien se puede aplicar sobre regiones.

Las tablas especiales que comiencen con C-u C-c * solo afectara a filas marcadas por ‘#‘ y ‘*‘. Las marcas tienen los siguientes significados:

! : Define nombres para las columnas, por lo que es posible usar $nombre en lugar de $6.
^ : Define nombres para las filas, por lo que cualquier formula en la tabla que use $m1, tomara el valor de la misma.
_ : Define nombres en los campos de la fila inferior.
$ : Campos en esta fila pueden definir parametros para formulas. Por ej. si un campo de una fila contiene $, y dentro contiene max=50, las formulas en esta tabla se podran referir a $max usando como valor 50. Los parametros trabajaran como constantes.
# : Campos en esta fila seran automaticamente recalculados mediante TAB, INTRO o S-TAB o mediante C-u C-c * para recalcularlo de forma global.
* : Selecciona esta linea para recalcular globalmente con C-u C-c *, pero no de forma automatica (para evitar carga cuando se edita demasiado).
: Lineas desmarcadas estan excentas de calculos con C-u C-c *.
/ : No exporta esta linea.

Basicamente este es el uso de hojas de calculo con emacs, aunque en el siguiente articulo anadire una funcionalidad interesante que sabiendo esto puedan crearse graficos sobre dichos datos.