我正在尝试执行以下操作:
- 使用 matplotlib 包通过
imshow()
创建绘图,它给出 matplotlib.image.AxesImage
- 将
matplotlib.image.AxesImage
转换为PIL.ImageTk.PhotoImage
- 使用此
PIL.ImageTk.PhotoImage
作为 TkInter Canvas 上的图像
如何在不保存任何图像的情况下完成上述操作?
在引用一篇文章后,我尝试使用以下代码直接对我的数据进行颜色编码:
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
可能是什么问题?
您必须创建并清空 ImageTk.PhotoImage
实例,然后将 Image
实例中的内容粘贴到此处。
如果您正在读取 AxesImage
对象(由 imshow
返回),您可以先将其数据传输到 Image
,然后粘贴到照片图像
。
这是一个示例(请注意,您实际上需要通过网格计算 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()
这将导致类似的结果:
我是一名优秀的程序员,十分优秀!