Как преобразовать объект Figure в массив Numpy со значениями RGBA? - PullRequest
1 голос
/ 10 января 2020

У меня есть объект Plotly Figure, который я создал, используя Plotly. Я хочу преобразовать этот объект Figure в Numpy Array. Так что я могу затем преобразовать эти данные массива в объект изображения PIL. И они drawImage на Reportlab, используя метод .drawImage.

Здесь b - объект Plotly Figure.

def fig2data ( b ):
    """
    @brief Convert a Plotly figure to a 4D numpy array with RGBA channels and return it
    @param fig a plotly figure
    @return a numpy 3D array of RGBA values
    """
    # draw the renderer
    fig.canvas.draw ( )
    # Get the RGBA buffer from the figure
    w,h = fig.canvas.get_width_height()
    buf = numpy.fromstring ( fig.canvas.tostring_argb(), dtype=numpy.uint8 )
    buf.shape = ( w, h,4 )
    # canvas.tostring_argb give pixmap in ARGB mode. Roll the ALPHA channel to have it in RGBA mode
    buf = numpy.roll ( buf, 3, axis = 2 )
    return buf

buf = fig2data(b)
buf

, что дает мне

AttributeError: 'Figure' object has no attribute 'canvas'

Я использую следующую библиотеку :

import pandas
import numpy
import plotly.graph_objects as go
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer, Image, Flowable
from reportlab.lib.units import inch
from reportlab.lib.styles import getSampleStyleSheet

Спасибо.

1 Ответ

0 голосов
/ 10 января 2020

Не уверен насчет ваших настроек или импорта, но если все хорошо, ваша проблема может заключаться в том, что вам нужно прикрепить холст к рисунку. Это делается с помощью FigureCanvasAgg:


    from matplotlib.backends.backend_agg import FigureCanvasAgg

    def fig2data ( b ):
        """
        @brief Convert a Matplotlib figure to a 4D numpy array with RGBA channels 
         and return it
        @param fig a matplotlib figure
        @return a numpy 3D array of RGBA values
        """

        canvas = FigureCanvasAgg(fig)
        # draw the renderer
        fig.canvas.draw ( )
        # Get the RGBA buffer from the figure
        w,h = fig.canvas.get_width_height()
        buf = numpy.fromstring ( fig.canvas.tostring_argb(), dtype=numpy.uint8 )
        buf.shape = ( w, h,4 )
        # canvas.tostring_argb give pixmap in ARGB mode. Roll the ALPHA channel to 
         have it in RGBA mode
        buf = numpy.roll ( buf, 3, axis = 2 )
        return buf

    buf = fig2data(b)
    buf

Надеюсь, это поможет

...