我想使用drawImage方法将使用matplotlib生成的图形添加到reportlab画布中,而不必先将图形保存到硬盘驱动器中.
我的问题与以下内容有关: ReportLab是否有可流动的matplotlib?,很好地解决了.但是,我不想使用DocTemplates,Stories,Flowables等.如上所述,我想使用drawImage将它放在画布中的某个位置.
我尝试使用以下方法将matplotlib图转换为PIL图像:
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()
Run Code Online (Sandbox Code Playgroud)
试图imgdata在错误中绘制结果:
AttributeError: 'cStringIO.StringO' object has no attribute 'rfind'
Run Code Online (Sandbox Code Playgroud)
虽然绘图im给出:
AttributeError: rfind
Run Code Online (Sandbox Code Playgroud)
现在有人如何解决这个问题?任何帮助将不胜感激.
我正在使用嵌入在WxPython GUI中的matplotlib图来呈现一些数据.图中的内容(显示的数据)随点击按钮的功能不断变化,...
数据有两种类型.
1)轮廓线
self.axes.contour(x_scale_map,y_scale_map,matrix,cl,cmap=my_cmap,extent=0,matrix.shape[1]-1,0,matrix.shape[0]-1))
Run Code Online (Sandbox Code Playgroud)
加载速度相对较慢(~1s),但不会经常变化.
2)在这个轮廓的顶部,我绘制了一些例如线条
self.axes.axhline(y,color='black')
Run Code Online (Sandbox Code Playgroud)
这些线条显然是立即绘制的,并且经常根据用户点击的内容进行更改.在这些情况下,先前绘制的线条需要消失,新的线条需要出现,而等高线图保持不变.
现在,我的问题如下.我还没有找到一种方法只删除线条而不是轮廓.获得所需结果的唯一方法似乎是:
self.axes.clear()
Run Code Online (Sandbox Code Playgroud)
然后重新绘制轮廓和新线.但如上所述,每次重新加载轮廓都很慢,因而很烦人.
有没有办法只清除图中的线条?我试图通过做类似的事情来使用叠加的子图:
self.axes1 = self.fig.add_subplot(111)
self.axes2 = self.fig.add_subplot(111)
self.axes1.contour(...)
self.axes2.axhline(y,color='black')
self.axes2.clear()
Run Code Online (Sandbox Code Playgroud)
但是最后一行清除了整个数字.
有谁知道如何实现所需的功能?谢谢