graficas.py: Contiene las gráficas que van a ser generadas Una grafica es algo como lo que sigue: 1: # Torre de Benagalbón 2: g=GRAFICA("Grafica de Torre de Benagalbon",s) 3: g.config(config) 4: g.sizex("date:20/08/2006_07:20:00","date:23/08/2006_07:20:00") 5: g.sizey(-100,1000,40,20) 6: g.addaxis(1,"der","Temperatura (ºC)",[1.5,2,-0.008],[50,800,1,22,1]) 7: g.addaxis("Eje","sup",None,[0.3,verde,0.008],["date:22/08/2006_07:15:00","date:23/08/2006_00:15:00","L",1,"15m"]) 8: g.addline("Evento 3","C1_Torredelmar:(22/08/2006_07:15:00,23/08/2006_07:15:00) * 5 med:10","a","med",azul_claro,0.5,(circuloC,False)) 9: g.leyenda("Evento 3") 10: g.outpng("01 Grafica de Torre de Benagalbon - %ifecha - %hora - completita.png","Torre de Benagalbón",size) -Las líneas que comienzan por # son comentarios y no se procesarán, línea 1 -La línea 2 es la declaración de la Grfica, el nombre es importante "Grafica de Torre de Benagalbon" debido a que será usado en la como referencia en posibles errores en la configuracion. -La línea 3 es la que inicializa la config por defecto -La línea 4 indica como va a computarse el eje X -La línea 5 indica como va a computarse el eje Y -La línea 6 indica que se añada un eje nuevo de referencia a la derecha -La línea 7 indica que se añada un eje nuevo de referencia en la parte superior -La línea 8 indica que se añada una nueva línea a la gráfica -La línea 9 indica que se muestre la leyenda de la línea "Evento 3" añadida en la línea 8 -La línea 10 indica que se genere la gráfica: (nombre,título,ancho,alto), el ancho y el alto son valores opcionales establecidos en la configuración por defecto. Soporta el filtro para el título y el nombre de la gráfica. === FILTRO === %fechatexto: DD de MES (Hoy -> DD=dia, MES=Mes en formato texto) %fechatextoayer: DD de MES (Ayer -> DD=dia, MES=Mes en formato texto) %fecha: DD-MM-AAAA (Hoy -> DD=dia, MM=mes, AAAA=anyo) %ayer: DD-MM-AAAA (Ayer -> DD=dia, MM=mes, AAAA=anyo) %ifecha: AAAA-MM-DD (Hoy -> DD=dia, MM=mes, AAAA=anyo) %iayer: AAAA-MM-DD (Ayer -> DD=dia, MM=mes, AAAA=anyo) %mes: MES (Hoy -> MES=Mes en formato texto) %mesayer: MES (Ayer -> MES=Mes en formato texto) %semana: SEMANA (Hoy -> SEMANA=Dia de la semana) %semanaayer: SEMANA (Ayer -> SEMANA=Dia de la semana) %hora: hh:mm (Ahora -> hh:hora, mm:minutos) %epoch: eeee (Ahora -> En formato EPOCH) %now: nnnn (Ahora -> En formato EPOCH) === SIZEX === Propiedades de sizex: (fecha de inicio, fecha de fin, tamaño de los pasos) fecha de inicio y fecha de fin indican desde donde a donde se va a pintar la gráfica, lo que al fondo y el eje X se refiere, el tamaño de los pasos indica donde se va a poner cada tick en el eje X, generalmente los pasos son "horas" (mirar configuración por defecto), por lo tanto habrá un tick cada hora. El tamaño de los pasos puede ser: "segundos", "seconds", "minutos", "minuts", "horas", "hours", "dias", "days". El formato de la fecha de inicio, fecha de fin usan la calculadora temporal, mirar más abajo. Ejemplo: g.sizex("date:ayer + 6h","date:hoy + 6h"): genera una gráfica de un día, marcada en horas, desde ayer 6:00am a hoy 6:00am g.sizex("date:22/08/2006_07:15:00","date:22/09/2006_07:15:00","dias"): genera una gráfica marcada en días, del mes trancurrido entre el 22/08/2006 y el 22/09/2006 comenzando a las 07:15am y terminando a las 07:15am === SIZEY === Propiedades de sizey: (valor de inicio, valor de fin, poner texto cada n valores, poner tick cada m valores) Ejemplo: g.sizex(-100,1000,40,20): pintar el ejeY deste -100 a 1000, poniendo valores cada 40 unidades y un tick cada 20 unidades === ADDAXIS === Propiedades de addaxis: (id,orilla,texto,graficador,transformador) id: se ponga un entero, un decimal o una cadena, es tranformado a cadena por la función str(), y es un dato de referencia para poder hacer que las líneas puedan autoescalarse con las propiedades de un eje dado. orilla puede ser: "sup", "inf", "der", "izq", cuando se indica añadir una orilla "izq" o "inf", se usará sólamente su texto para sustituir al texto de ese eje, el resto de propiedades no serán usadas, además si se indican varios inferiores (inf) o izquierdos (izq), se usará sólamente el último indicado de los inferiores y el último de izquierdos. Por lo tanto el uso real del graficador y el transformador se aplica a las orilla derecha (der) y superior (sup). El graficador: contiene datos para pintar a) (posicion de la leyenda) -> (1.3) b) (posicion de la leyenda, color) -> (1.3,rojo) c) (posicion de la leyenda, color, tamaño del tick) -> (1.3,rojo,-0.008) Si el tick es >0 sale por la derecha del eje, tick <0 sale por la izq del eje El transformador: contiene datos de transformación del eje a) (minimo real, maximo real, minimo virtual, maximo virtual, tamaño de los pasos) -> (50,800,1,22,1) Se escala el resultado de la función poniendo en 50 lo que en la función vale 1 y en 800 lo que en la función vale 22, y se pintan los ticks en pasos de 1. Por supuesto si un valor está entre 1 y 22, se escala a su proporcion exacta en la escala entre 50 y 800 b) ("texto de transformación" -> ("* 1.3 + 100") ¡¡¡[NO SOPORTADO POR "sup"]!!! Se coje el eje izquierdo y se multiplica la escala por 1.3 y se le suma 100, los valores del eje son los resultantes de la transformación c) ("texto de transformación",minimo virtual,maximo virtual) -> ("* 1.3 + 100", 100, 300) ¡¡¡[NO SOPORTADO POR "sup"]!!! Se coje el eje izquierdo y se multiplica la escala por 1.3 y se le suma 100, los valores a pintar comienzan en 100 y terminan en 300, los valores intermedios estarán posicionados según los ticks de la transformación y usando el valor que corresponda en la escala entre 100 y 300. Ejemplo: g.addaxis(1,"der","Temperatura (ºC)",[1.5,2,-0.008],[50,800,1,22,1]) Añade un eje a la derecha llamado "Temperatura (ºC)" que está en la posición x=1.5, usando el color 2 y el tick tiene una longitud de 0.008 hacia la izquierda del eje, los valores y ticks serán pintados entre 50 y 800, poniendo ticks en pasos de 1, contando desde 1 a 22, siendo 1 la posición 50 del eje Y y 22 la posición 800. El id de este eje para referencias es "1". g.addaxis("Eje","sup",None,[0.3,verde,0.008],["date:22/08/2006_07:15:00","date:23/08/2006_00:15:00","L",1,"15m"]) Añade un eje en la parte superior ¡sin nombre!, en la posición 0.3 por encima del eje superior, usando el color verde, y con los ticks por encima del eje con una longitud de 0.008, la transformación se realiza haciendo corresponder la fecha 22/07/2006 07:15:00 con el valor "L" (LUNES) y creciendo a pasos de 1 (es decir "M", "X", ...), poniendo una marca cada "15m" (15 minutos), el crecimiento se hace siguiendo esta regla hasta la fecha 23/08/2006 00:15:00am. En resumen: escribirá "L" en 22/08/2006 07:15, "M" en 22/08/2006 07:30, "X" en 22/08/2006 07:45,....hasta llegar al 23/08/2006 00:15. Es observable que los valores reales son obtenidos por computación mediante la calculadora temporal (consultar más abajo), el tamaño de los pasos también usa la calculadora temporal (ver más abajo). El id de este eje para referencias es "Eje". === ADDLINE === Propiedades de addline: (nombre,senal,senaltipo,linea,color,grosor,tipo,filtro) El nombre DEBE ser distinto para cada línea de la gráfica El senal corresponde al nombre de la señal que representa la línea, puede tener varios formatos explicados abajo (Explicacion SENAL). El senaltipo corresponde a "a" (analógica) o "d" (digital) La línea puede contener parámetros, para ellos se separa con ":", e indica cómo se va a pintar la línea escalera, lineal, maximos, minimos, medias, evento Color representa el color de la línea, en los eventos existe su propio formato (ver más abajo Explicacion EVENTOS) Grosor representa el grosor de la línea Tipo indica el tipo de línea, generalmente solida, a puntos, rayas y puntos, etc...los eventos, media, máximos y mínimos tienen su propio formato explicado abajo (Explicacion EVENTOS, Explicación MAXIMOS-MINIMOS, Explicacion MEDIA) Filtro, generalmente no se usa, sólo en la media (mirar más abajo Explicacion MEDIA) ****** Explicacion MAXIMOS-MINIMOS: representa (tipo1,tipo2,ponertexto) donde tipo1 y tipo2, son tipos de puntos para representar los MAXIMO-MINIMOS, el tipo1 son los que no sobrepasan los límites de la gráfica (MAXIMOS-MINIMOS normales), el tipo2 son los que sobrepasan los límites de la gráfica (mayores que el máximo posible de la gráfica). Poner texto significa que hay que pintar el texto en cada punto (Booleano: True-False). ****** Explicacion MEDIA: representa (tipo,ponertexto), básicamente es el tipo de cada punto de la media y si hay que poner o no el texto (Booleano: True-False). El filtro indica si los valores dados en el rango están ajustados o no. Cuando un valor está ajustado significa que no existe color para los valores de enmedio, es decir, que los valores dados sólo son pintados cuando el valor está exactamente en el rango con un color asignado, en caso de que el valor esté entre 2 valores del rango, no dispondrá de color para ser pintado. Ejemplo: g.addline("Evento 3","C1_Torredelmar:(22/08/2006_07:15:00,23/08/2006_07:15:00) * 5 med:10","a","med",azul_claro,0.5,(circuloC,False)) ****** Explicacion EVENTOS: representa el rango de colores y el rango de valores Rangos ajustados: La señal puede usar el filtro a True para indicar que los rangos de colores y valores están ajustados, lo que significa que se mostrará el color X1 cuando la gráfica cruce el valor Y1, y el color X2 cuando la gráfica cruze el valor X2, no cuando el valor de la gráfica está entre Y1 e Y2. En el cajo de rangos ajustados es obligatorio que la lista de colores y la lista de valores tengan la misma longitud para enlazar cada valor con su color. Rango de colores: contiene un listado de los colores que van a ser mostrados en este evento. Su formato es una tupla de 3 elementos (color de las letras,lista de colores,color para valores fuera del rango) Rango de valores: (su formato es una lista de números) contiene un listado de valores que será usado para mostrar los colores, hay 2 tipos: a) Cuando el listado de valores es de longitud 2, almenos es necesario un color en la lista de colores. Lo que se hace es particionar el espacio entre el valor 1 y el valor 2 en tantos huecos como colores haya, y cuando la gráfica esté pasando por un hueco, se pinta el evento con el color de ese hueco. b) Cuando el listado de valores es de longitud mayor que 2, es obligatorio que el listado de colores sea de longitud de la lista de valores menos 1, en este caso se la lista de valores representa los huecos y el primer color se asignará al primer hueco (correspondiente al hueco dejado entre el valor 1 y el valor 2). Ejemplo ajustado: valores=[1,2,3] colores=[rojo,azul,verde] Cuando la gráfica vale 1 y sólo 1, se pinta rojo Cuando la gráfica vale 2 y sólo 2, se pinta azul Cuando la gráfica vale 3 y sólo 3, se pinta verde Ejemplo a: valores=[0,32] colores=[rojo,azul,verde,amarillo] Cuando la gráfica está entre 0 y 8, se pinta rojo Cuando la gráfica está entre 8 y 16, se pinta azul Cuando la gráfica está entre 16 y 24, se pinta verde Cuando la gráfica está entre 24 y 32, se pinta amarillo Ejemplo b: valores=[0,5,10,15,32] colores=[rojo,azul,verde,amarillo] Cuando la gráfica está entre 0 y 5, se pinta rojo Cuando la gráfica está entre 5 y 10, se pinta azul Cuando la gráfica está entre 10 y 15, se pinta verde Cuando la gráfica está entre 15 y 32, se pinta amarillo ****** Explicacion SENAL: La senal puede contener los siguientes formatos: "AAA BBB CCC ..." Donde cada elemento es procesado en la calculadora AAA puede ser un operador o un valor, los valores pueden ser valores enteros, valores reales o señales de la tabla de señales. Las señales soportan argumentos (para seleccionar por ejemplo el rango a procesar), si no se indica se usa el rango indicado en sizex. Los operadores pueden ser cualquier procesable por python, sqrt, ^, med, max, min, axis. Los 4 últimos además soportan argumentos propios que se escriben separando el operador del argumento con el caracter ":" (Ejemplo: "med:4" obtiene 4 medias), en el caso de med (media), max (maximos) y min (minimos) se indica el número de elementos a obtener de la gráfica (cuantas medias, máximos o minimos), en el caso de axis se indica el id del eje al que enlazar el escalado que deseamos realizar. Es posible sumar y restar unas señales con otras, o multiplicarlas por un valor. Si dos señales tienen elementos distintos en el tiempo, los elementos que no coinciden son interpolados. Ejemplo: "C1_Torredelmar:(22/08/2006_07:15:00,23/08/2006_07:15:00) * 5 med:10" Coje la señal C1_Torredelmar, saca los datos entre el 22/08/2006 07:15 y 23/08/2006 07:15, multiplicala por 5, y muestrame 10 medias del resultado === CALCULADORA TEMPORAL (formatos soportados) === "AAA BBB CCC ...": donde cada valor es computado según su previo valor, es decir se calcula AAA y su resultado es calculado con BBB y su resultado con CCC, etc... AAA,BBB,CCC,... pueden ser: "valor" o "operador" teniendo en cuenta que el operador debe estar precedido de algún resultado sobre el que operar y que si el operador es unario será suficiente con poner el operador, pero si es binario necesitará un segundo valor después del operador, siempre separados por espacios. operador puede ser: operadores básicos soportados por python "sqrt": para la raiz cuadrada (operador unario) "^": para el operador elevar a (operador binario), equivalente a "**" en python numero: puede ser un número numero+caracter: puede ser un número seguido de una unidad ("s":segundos, "m":minutos, "h":horas, "d":dias, "k":kilo, "M":Mega, "G":Giga, "T":Tera) "ahora" o "now": este mismo instante "fecha:XXX" o "date:XXX": indica que en XXX viene una fecha que hay que computar XXX pueder ser: YYY: indica una fecha (YYY) YYY_ZZZ: indica una fecha (YYY) y una hora (ZZZ) YYY puede ser: "hoy" o "today": indica la fecha de hoy "ayer" o "yesterday": indica la fecha de ayer "DD/MM/AAAA": indica el día (DD), el mes (MM) y el anyo (AAAA) ZZZ puede ser: "hh:mm:ss": indica la hora (hh), los minutos (mm) y los segundos (ss) Ejemplos válidos: "date:ayer + 6h": fecha de ayer a las 06:00:00 de la mañana "date:22/08/2006_07:15:00": fecha del 22/08/2006 a las 07:15:00 de la mañana