如何在Reportlab画布中绘制Image Matplotlib图形?

发布于 2021-01-29 16:00:35

我想使用方法drawImage将使用matplotlib生成的图形添加到reportlab画布,而不必先将图形保存到硬盘。

我的问题涉及:
ReportLab是否有可流通的matplotlib?,这很好地解决了。但是,我不希望使用DocTemplates,Stories,Flowables等。如上所述,我想使用drawImage将其放在画布中的某个位置。

我尝试使用以下方法将matplotlib图形转换为PIL图像:

1)http://www.icare.univ-
lille1.fr/wiki/index.php/How_to_convert_a_matplotlib_figure_to_a_numpy_array_or_a_PIL_image

2)http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-
server

例如,一些无效的代码是:

import Image
import matplotlib.pyplot as plt
import cStringIO
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm

fig = plt.figure(figsize=(4, 3))
plt.plot([1,2,3,4])
plt.ylabel('some numbers')

imgdata = cStringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0)  # rewind the data
im = Image.open(imgdata)

c = canvas.Canvas('test.pdf')
#c.drawImage(imgdata, cm, cm, inch, inch)
c.drawImage(im, cm, cm, inch, inch)
c.save()

尝试绘制imgdata导致错误:

AttributeError: 'cStringIO.StringO' object has no attribute 'rfind'

绘制时im给出:

AttributeError: rfind

现在有人如何解决这个问题?任何帮助将不胜感激。

关注者
0
被浏览
154
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题在于drawImage需要ImageReader对象或文件路径,而不是文件句柄。

    以下应该工作:

    import Image
    import matplotlib.pyplot as plt
    import cStringIO
    from reportlab.pdfgen import canvas
    from reportlab.lib.units import inch, cm
    
    from reportlab.lib.utils import ImageReader
    
    fig = plt.figure(figsize=(4, 3))
    plt.plot([1,2,3,4])
    plt.ylabel('some numbers')
    
    imgdata = cStringIO.StringIO()
    fig.savefig(imgdata, format='png')
    imgdata.seek(0)  # rewind the data
    
    Image = ImageReader(imgdata)
    
    c = canvas.Canvas('test.pdf')
    c.drawImage(Image, cm, cm, inch, inch)
    c.save()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看