问题 如何在reportlab画布中绘制一个matplotlib图形?


我想使用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

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


12338
2017-09-19 14:30


起源

好问题!我想知道。 - Joel Vroom
您可能需要显示一些代码。我有足够的运气从matplotlib生成图像并使用drawImage,我不记得曾经看到过这个错误。 - G Gordon Worley III
@JoelVroom如果你喜欢这个问题,请确保你投票。 - tacaswell
@GGordonWorleyIII我添加了几行代码来向原始问题展示我的问题。 - savantas


答案:


问题是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()

10
2017-10-03 13:28