Matplotlib figure to image as a numpy array

后端 未结 5 1029
礼貌的吻别
礼貌的吻别 2020-11-28 10:58

I\'m trying to get a numpy array image from a Matplotlib figure and I\'m currently doing it by saving to a file, then reading the file back in, but I feel like there has to

相关标签:
5条回答
  • 2020-11-28 11:33

    In order to get the figure contents as RGB pixel values, the matplotlib.backend_bases.Renderer needs to first draw the contents of the canvas. You can do this by manually calling canvas.draw():

    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure
    
    fig = Figure()
    canvas = FigureCanvas(fig)
    ax = fig.gca()
    
    ax.text(0.0,0.0,"Test", fontsize=45)
    ax.axis('off')
    
    canvas.draw()       # draw the canvas, cache the renderer
    
    image = np.fromstring(canvas.tostring_rgb(), dtype='uint8')
    

    See here for more info on the matplotlib API.

    0 讨论(0)
  • 2020-11-28 11:34

    For people who are searching an answer for this question, this is the code gathered from previous answers. Keep in mind that the method np.fromstring is deprecated and np.frombuffer is used instead.

    #Image from plot
    ax.axis('off')
    fig.tight_layout(pad=0)
    
    # To remove the huge white borders
    ax.margins(0)
    
    fig.canvas.draw()
    image_from_plot = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
    image_from_plot = image_from_plot.reshape(fig.canvas.get_width_height()[::-1] + (3,))
    
    0 讨论(0)
  • 2020-11-28 11:36

    I think there is some update, which is easier.

    canvas.draw()
    buf = canvas.buffer_rgba()
    X = np.asarray(buf)
    

    Updated version from the docs:

    from matplotlib.backends.backend_agg import FigureCanvasAgg
    from matplotlib.figure import Figure
    import numpy as np
    
    # make a Figure and attach it to a canvas.
    fig = Figure(figsize=(5, 4), dpi=100)
    canvas = FigureCanvasAgg(fig)
    
    # Do some plotting here
    ax = fig.add_subplot(111)
    ax.plot([1, 2, 3])
    
    # Retrieve a view on the renderer buffer
    canvas.draw()
    buf = canvas.buffer_rgba()
    # convert to a NumPy array
    X = np.asarray(buf)
    
    0 讨论(0)
  • 2020-11-28 11:41

    from the docs:

    https://matplotlib.org/gallery/user_interfaces/canvasagg.html#sphx-glr-gallery-user-interfaces-canvasagg-py

    fig = Figure(figsize=(5, 4), dpi=100)
    # A canvas must be manually attached to the figure (pyplot would automatically
    # do it).  This is done by instantiating the canvas with the figure as
    # argument.
    canvas = FigureCanvasAgg(fig)
    
    # your plotting here
    
    canvas.draw()
    s, (width, height) = canvas.print_to_buffer()
    
    # Option 2a: Convert to a NumPy array.
    X = np.fromstring(s, np.uint8).reshape((height, width, 4))
    
    0 讨论(0)
  • 2020-11-28 11:44

    To fix the large margins Jorge references, add ax.margins(0). See here for details.

    0 讨论(0)
提交回复
热议问题