11

I want to use plots generated with matplotlib as textures in OpenGL. The OpenGL backends for matplotlib I came across so far are either immature or discontinued, so I want to avoid them.

My current approach is to save figures into temporary .png files from which I assemble texture atlases. However, I would prefer to avoid storing intermediate files and get pixel data directly from matplotlib instead. Is this possible somehow?


The answer I was looking for is fig.canvas.print_to_buffer(). Joe's answer contains other alternatives worth checking out.

1 Answer 1

23

Sure, just use fig.canvas.tostring_rgb() to dump the rgb buffer to a string.

Similarly, there's fig.canvas.tostring_argb() if you need the alpha channel, as well.

If you want to dump the buffer to a file, there's fig.canvas.print_rgb and fig.canvas.print_rgba (or equivalently, print_raw, which is rgba).

You'll need to draw the figure before dumping the buffer with tostring*. (i.e. do fig.canvas.draw() before calling fig.canvas.tostring_rgb())

Just for fun, here's a rather silly example:

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

enter image description here enter image description here enter image description here

Sign up to request clarification or add additional context in comments.

6 Comments

Thank you for pointing me in that direction. There is a fig.canvas.print_to_buffer() which seems to be exactly what I'm looking for!
Joe, is there a way to NOT display on screen the first 2 of the 3 subplots?
@JamesSynge - Sure, just clear the figure each time you grab its contents. As a fun example (I wrote this when I originally wrote the answer): gist.github.com/joferkington/9138655
@JoeKington, thanks. Matplotlib has so many options, I didn't find clf (I did search for clear, but didn't think of clf).
fig.canvas.tostring_rgb() and others are deprecated
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.