velazquezr35 / eigpp

1 stars 0 forks source link

sobre el estilo de programación del módulo de ploteo #12

Open maurinhocba opened 3 years ago

maurinhocba commented 3 years ago

Para ir entrando en tema, quiero que usemos el enfoque que aparece resaltado en esta figura, copiada de esta parte de la página oficial de Matplolib. image

Me imagino un conjunto de funciones trabajando juntas.

Con eso es más que suficiente. Hay que tenerlo listo pronto.

Obviamente, si ves que conviene agregar otros datos de entrada (que pueden ir en kwargs) para poner títulos a gráficos y ejes, códigos de estilos de líneas o lo que sea, es bienvenido, siempre y cuando sea breve, porque necesitamos ponernos a analizar señales con urgencia.

Me preocupa que como está hecho todo, no nos va a servir de mucho para comparar resultados de distintas simulaciones, pero haremos unos wrappers luego, con otra clase más. Más adelante.

velazquezr35 commented 3 years ago

Profe,

Estuve trabajando un poco con este tema. Hay algunas cosas que me quedaron con dudas. El primero es el más importante, lo demás es accesorio.

Se me ocurre que el eje x tenga las etiquetas de los DOFs (sea u o q), el eje y su valor y que el label asociado a esa 'curva' sea el instante de tiempo asociado. Así se podrían plotear más de 1 por gráfica, quedarían distintas curvas para distintos tiempos. No sé el tema de las escalas, si nos quedan valores muy distintos...

[https://stackoverflow.com/questions/6309472/matplotlib-can-i-create-axessubplot-objects-then-add-them-to-a-figure-instance] [https://matplotlib.org/stable/tutorials/intermediate/artists.html] [https://stackoverflow.com/questions/34162443/why-do-many-examples-use-fig-ax-plt-subplots-in-matplotlib-pyplot-python]

Mientras tanto, sigo. Quedaría un archivo aparte, módulo 'plotter'. En estos días ya subo una primera versión al repo.

velazquezr35 commented 3 years ago

Update 29/06

El último commit de la branch dónde trabajo tiene avances respecto a las funciones para plotear.

en principio fig_ut está andando. Función de nivel superior, internamente usa plt_ut. En eg.py hay un pequeño ejemplo de lo que comento a continuación (se ve feo porque diverge al final).

Propuse algunos cambios respecto a tu planteo orginal: Estoy trabajando con dicts, me parecen más cómodos para pasar los argumentos armando todo estilo [[200000,[1,2],...]]. Directamente, generamos uno con keys dadas por los nodos de interés y values dadas por una lista de dofs que queremos per nodo: desired = {'200000':[1,2,5], '2000100':[5]}. Internamente, algunas cosas se pasan a listas, pero para usar las funciones se me hace más fácil.

Otra ventaja (aparente): Creo que no va a ser necesario definir fig_ut_col y fig_ut_one, dado que los casos de interés pueden cubrirse con una lista de diccionarios usando fig_ut:

¿Está bien planteado? Creo que así está en el pseudocódigo / comentarios, salvo que haya agarrado el tema muy mal. Si no estás de acuerdo con esto, vuelvo a listas puras y a la definición independiente; pero me pareció interesante y más cómodo. Además, no hay que andar con cuidado de la adaptación interna de las funciones a menor nivel, por ejemplo si hay más de un DOF, si hay varios, cuántos nodos, etc....

Respecto a lo demás:

Respecto a la parte de 'customizar' los gráficos:

maurinhocba commented 3 years ago

el tema de los diccionarios y fig_ut me parece muy bien veremos cómo vaya quedando lo demás cuando lo tengas hecho por si hay que arreglar algo todo excelente hasta acá

velazquezr35 commented 3 years ago

Update 17 07

Importante: Tengo que revisar bien el funcionamiento de las funciones ut_vt_PP (idem para la análoga de q). Entiendo que sería una figura con 3 axes: en el primero, u(t), segundo v(t), tercero PP(u(t)). Si alimento varios DOF (o modos en el caso de q), plotearía todo junto en cada uno de los axes. ¿Es correcto?

La alternativa es generar una 'matriz' de axes que plotee en filas los 3 tipos de gráficos (u,v,PP) y en columnas los DOFs deseados, de modo de utilizar 3 axe para cada DOF de interés (una columa per cada uno)

Comentarios commit:

Implementación de funciones para trabajar con los q

Opté por mantener la estructura ya existente (así queda todo más o menos homogéneo) y utilizar dicts para pasar los modos de interés. No cambia prácticamente nada. Lo propuesto era que los argumentos que indican los modos a plotear sean:

[1,3,4] > Ploteo modo 1,3 y 4 en 1 ax [[1,3],[2]] > Ploteo modo 1,3 en el primer ax, 2 en el segundo.

Me resultó más sencillo copiar lo ya en funcionamiento para los u: {'cualquier_nombre':[1,3,4]} > Plotea los modos 1,3,4 en 1 ax (no importa la key) [{'name':[1,3],{'otro_name':[2,3]}] > Plotea los modos 1,3 en el primer ax, modos 2,3 en el segundo

Es más o menos lo mismo... Pero internamente rescata prácticamente todas las estructuras.

IN PROGRESS: Acomodar un poco la documentación, el tema de la customización de labels, ejes y demás. Generar las funciones de índices de la reunión. Espero llegar a hacerlas mañana / el lunes antes de la reunión (si la hay)

velazquezr35 commented 3 years ago

23/07/21 Corrección de función para búsqueda de índices del vector tiempo, incorporación de atributos en objs stru plot_timeVals y plot_timeInds para guardar los valores (más cercanos) e índices según el usuario indique. Por default, los ínidices son 0 y -2 (para plotear hasta el último de manera sencilla, se lleva a -1 internamente) y np.inf para los valores. Las funciones a nivel fig llaman la función sfti_time (search for time indexes) en sim_db y actualizan esto (ínidices y valores, así el usuario puede ver si 'cae' cerca)

velazquezr35 commented 3 years ago

23/07/21 Ahora el ploteo de la parte modal se hace con índices 'naturales'. Internamente se lleva a los de python (-1)

velazquezr35 commented 3 years ago

Incorporación de funciones de ploteo para un instante único de tiempo.

Comentario: ¿Necesitamos la análoga fig_qxqy para comparar dos modos?

velazquezr35 commented 2 years ago

Nueva función para guardar plots: save_figure

Se agregó una función en plotter.py que permite guardar las figuras en formato deseado (default png, pero funciona con svg también). La llamada puede hacerse manualmente o mediante kwargs de las funciones fig de alto nivel. Se puede customizar la carpeta (si no existe se crea automáticamente, útil para automatizar luego o separar por corridas), el código de archivo (un prefijo), el nombre de archivo, dpi y layout.

Las gráficas prueba quedan guardadas en el drive.