matplotlib: render en buffer / acceso a datos de píxeles

Quiero usar gráficos generados con matplotlib como texturas en OpenGL. Los backends de OpenGL para matplotlib que encontré hasta ahora son inmaduros o descontinuados, así que quiero evitarlos.

Mi enfoque actual es guardar figuras en archivos temporales .png a partir de los cuales armo atlas de texturas. Sin embargo, preferiría evitar almacenar archivos intermedios y obtener datos de píxeles directamente de matplotlib. ¿Es esto posible de alguna manera?


La respuesta que estaba buscando es fig.canvas.print_to_buffer() . La respuesta de Joe contiene otras alternativas que vale la pena revisar.

Claro, solo usa fig.canvas.tostring_rgb() para volcar el búfer rgb a una cadena.

Del mismo modo, hay fig.canvas.tostring_argb() si también necesita el canal alfa.

Si desea volcar el búfer en un archivo, hay fig.canvas.print_rgb y fig.canvas.print_rgba (o, de manera equivalente, print_raw , que es rgba).

Tendrá que dibujar la figura antes de volcar el búfer con tostring* . (es decir, haga fig.canvas.draw() antes de llamar a fig.canvas.tostring_rgb() )

Solo por diversión, aquí hay un ejemplo bastante tonto:

 import matplotlib.pyplot as plt import numpy as np def main(): t = np.linspace(0, 4*np.pi, 1000) fig1, ax = plt.subplots() ax.plot(t, np.cos(t)) ax.plot(t, np.sin(t)) inception(inception(fig1)) plt.show() def fig2rgb_array(fig): fig.canvas.draw() buf = fig.canvas.tostring_rgb() ncols, nrows = fig.canvas.get_width_height() return np.fromstring(buf, dtype=np.uint8).reshape(nrows, ncols, 3) def inception(fig): newfig, ax = plt.subplots() ax.imshow(fig2rgb_array(fig)) return newfig main() 

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí