将matplotlib AxesImage转换为PIL PhotoImage,如何在Tkinter中绘制matplotlib结果

时间:2013-08-31 10:03:40

标签: python matplotlib tkinter python-imaging-library

我正在尝试执行以下操作:

  1. 使用matplotlib包使用imshow()创建绘图,该包提供matplotlib.image.AxesImage
  2. matplotlib.image.AxesImage转换为PIL.ImageTk.PhotoImage
  3. 将此PIL.ImageTk.PhotoImage用作TkInter画布上的图像
  4. 如何在不保存任何图像的情况下完成上述操作?

    在推荐帖子后,我尝试使用以下代码直接对我的数据进行颜色编码:

    from Tkinter import *
    from PIL import ImageTk,Image
    import numpy as np
    from pylab import cm
    root=Tk()
    canvas = Canvas(root)
    canvas.pack(expand = YES, fill = BOTH)    
    x = np.linspace(0, 2 * np.pi, 120)
    y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
    myarray = np.sin(x) + np.cos(y)
    image1 = Image.fromarray(np.uint8(cm.gist_earth(myarray)*255))
    test = canvas.create_image(10,10,image = image1)
    #canvas.itemconfig(test, image=nextimage)    
    mainloop()
    

    上面的代码给出了错误

    TclError: image "<PIL.Image.Image image mode=RGBA size=120x100 at 0x2DC01E8>" doesn't exist
    

    可能是什么问题?

1 个答案:

答案 0 :(得分:1)

您必须创建并清空ImageTk.PhotoImage个实例,然后将Image实例中的内容粘贴到那里。

如果您正在阅读AxesImage对象(由imshow返回),则可以先将其数据传输到Image,然后粘贴到PhotoImage

以下是一个示例(请注意,您实际上需要在网格网格上计算myarray):

from Tkinter import *
from PIL import Image, ImageTk
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
root=Tk()
canvas = Canvas(root)
canvas.pack(expand = YES, fill = BOTH)
x = np.linspace(0, 2*np.pi, 400)
y = np.linspace(0, 2*np.pi, 400)
X, Y = np.meshgrid(x, y, copy=False)
myarray = np.cos(X) + np.cos(Y)

im_plt = plt.imshow(myarray)

image1 = Image.fromarray(np.uint8( im_plt.get_cmap()(im_plt.get_array())*255))
im = ImageTk.PhotoImage('RGB', image1.size)
im.paste(image1)
test = canvas.create_image(0, 0, image=im)
mainloop()

这将导致类似:

enter image description here