typewriter tutorial examples bootstrap animations animate animation numpy video matplotlib png

animation - tutorial - ¿Puedo hacer algo como imsave() con superposición de texto?



typewriter effect css (1)

Método 1

Usando una excelente respuesta a otra pregunta como referencia, se me ocurrió la siguiente variante simplificada que parece funcionar bien: solo asegúrese de que la relación de aspecto del tamaño de figsize ( que se da en pulgadas ) coincida con la relación de tamaño de los datos de la gráfica:

import numpy as np import matplotlib.pyplot as plt test_image = np.eye(100) fig = plt.figure(figsize=(4,4)) ax = plt.axes(frameon=False, xticks=[],yticks=[]) ax.imshow(test_image) plt.savefig(''test.png'', bbox_inches=''tight'', pad_inches=0)

Tenga en cuenta que estoy usando imshow con test_image , que podría comportarse de forma diferente a otras funciones de trazado ... por favor, hágamelo saber en un comentario en caso de que quiera hacer otra cosa.

También tenga en cuenta que la imagen será (re) muestreada, por lo que el figsize la figsize influirá en la resolución de la imagen escrita.

Como se señaló en los comentarios , la configuración de tamaño de figsize no coincide con el tamaño de la imagen de salida (o el tamaño en la pantalla, para el caso). Para superar esto, usa ...

Método 2

Lectura de la entrada de preguntas frecuentes Mueva el borde de un eje para dejar espacio para etiquetas , encontré una manera de hacer que el parámetro de figsize establezca el tamaño de la imagen de salida directamente, moviendo las figsize los ejes fuera del área visible:

import numpy as np import matplotlib.pyplot as plt test_image = np.eye(100) fig = plt.figure(figsize=(4,4)) ax = fig.add_axes([0,0,1,1]) ax.imshow(test_image) plt.savefig(''test.png'')

Tenga en cuenta que savefig tiene una configuración PPP predeterminada (100 en mi caso) que, en combinación con figsize , determina el número de píxeles en las direcciones xey de la imagen guardada. Puede anular esto con el argumento de palabra clave dpi para savefig .

Si desea mostrar la imagen en la pantalla en lugar de guardarla (utilizando plt.show() lugar de la línea plt.savefig en el código anterior), el tamaño de la figura depende (aparte del parámetro de figsize ya familiar figsize ) la configuración de DPI de la figura , que también tiene un valor predeterminado (80 en mi sistema). Este valor puede anularse pasando el argumento de palabra clave dpi a la llamada plt.figure() .

Estoy usando imsave() secuencialmente para hacer muchos PNG que combinaré como un AVI y me gustaría agregar anotaciones de texto en movimiento. Uso ImageJ para hacer AVI o GIF.

No quiero los ejes, los números, los bordes ni nada, solo la imagen en color (como imsave() proporciona, por ejemplo, imsave() ) con texto (y tal vez flechas) dentro. Estos cambiarán cuadro por cuadro. Disculpe el uso de jet.

Podría usar savefig() con ticks off y luego cortar como postprocesamiento, pero ¿hay una manera más conveniente, directa o "matplotlibithic" de hacer esto que no sería tan difícil en mi disco duro? (la cosa final será bastante grande).

Un fragmento de código, agregado por solicitud:

import numpy as np import matplotlib.pyplot as plt nx, ny = 101, 101 phi = np.zeros((ny, nx), dtype = ''float'') do_me = np.ones_like(phi, dtype=''bool'') x0, y0, r0 = 40, 65, 12 x = np.arange(nx, dtype = ''float'')[None,:] y = np.arange(ny, dtype = ''float'')[:,None] rsq = (x-x0)**2 + (y-y0)**2 circle = rsq <= r0**2 phi[circle] = 1.0 do_me[circle] = False do_me[0,:], do_me[-1,:], do_me[:,0], do_me[:,-1] = False, False, False, False n, nper = 100, 100 phi_hold = np.zeros((n+1, ny, nx)) phi_hold[0] = phi for i in range(n): for j in range(nper): phi2 = 0.25*(np.roll(phi, 1, axis=0) + np.roll(phi, -1, axis=0) + np.roll(phi, 1, axis=1) + np.roll(phi, -1, axis=1) ) phi[do_me] = phi2[do_me] phi_hold[i+1] = phi change = phi_hold[1:] - phi_hold[:-1] places = [(32, 20), (54,25), (11,32), (3, 12)] plt.figure() plt.imshow(change[50]) for (x, y) in places: plt.text(x, y, "WOW", fontsize=16) plt.text(5, 95, "Don''t use Jet!", color="white", fontsize=20) plt.show()