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()