Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印到图像对象_Python_Numpy_Matplotlib_Plot_Imshow - Fatal编程技术网

Python 打印到图像对象

Python 打印到图像对象,python,numpy,matplotlib,plot,imshow,Python,Numpy,Matplotlib,Plot,Imshow,我可以使用imshow()保存单个绘图,因为它返回图像对象,如下所示: image = plt.imshow(list, interpolation=None) # Save PNG to memory buffer as BytesIO from io import BytesIO buffer = BytesIO() plt.savefig(buffer,format='png') PNG = buffer.getvalue() 稍后,我想创建许多这些图像的动画,保存在列表中,并将其渲

我可以使用
imshow()
保存单个绘图,因为它返回图像对象,如下所示:

image = plt.imshow(list, interpolation=None)
# Save PNG to memory buffer as BytesIO
from io import BytesIO
buffer = BytesIO()

plt.savefig(buffer,format='png')
PNG = buffer.getvalue()

稍后,我想创建许多这些图像的动画,保存在列表中,并将其渲染为视频。(如果这种方法很愚蠢,请让我知道,我担心我做错了什么。)

但是我不知道我怎么能用两个子地块的图形做同样的事情。难道不应该有一个函数返回图像对象吗

list = [[1,2,3,4,5,6,7,8],
        [1,2,3,4,5,6,7,8]]
list2 = [[1,2,3,4,5,6,7,8],
        [1,2,3,4,5,6,7,8]]

fig = plt.figure()

ax = fig.add_subplot(2, 1, 1)
ax.imshow(list, interpolation=None)

ax2 = fig.add_subplot(2, 1, 2)
ax2.imshow(list, interpolation=None)

plt.show()
我不想显示绘图,而是想将其保存为图像对象。 我的目标是创建一个动画(许多情节)并将其渲染为视频。也许我的方法是错误的。有更好的解决办法吗

plt.savefig('someimgname.jpg')
这样就行了。但请记住,完成此操作后,使用
Image.open()
打开此操作即可

im  = Image.open('someimgname.jpg')
im.show() # or do whatever you want to do with this image object
示例代码:

from matplotlib import pyplot as plt
from PIL import Image

list = [[1,2,3,4,5,6,7,8],
        [1,2,3,4,5,6,7,8]]
list2 = [[1,2,3,4,5,6,7,8],
        [1,2,3,4,5,6,7,8]]

fig = plt.figure()

ax = fig.add_subplot(2, 1, 1)
ax.imshow(list, interpolation=None)

ax2 = fig.add_subplot(2, 1, 2)
ax2.imshow(list, interpolation=None)
plt.savefig('someimgname.jpg')
im = Image.open("someimgname.jpg")  # desired image object
im.show()
plt.show()
参考资料:

  • 回答的第二部分,我检查了文档中的
    matplotlib.pyplot.savefig(*args,**kwargs)
    它说

    第一个参数
    fname
    是一个路径,或者类似于Python文件的对象,或者可能是一些后端依赖的对象,例如

    在python文件中,类对象是
    StringIO
    对象

    buf = io.BytesIO()
    plt.savefig(buf, format='jpg')
    buf.seek(0)
    im = Image.open(buf)
    
    从python文档来看,它更有意义:-

    内存流:也可以使用str或字节,如 对象作为文件进行读取和写入。弦乐 可以像在文本模式下打开的文件一样使用。BytesIO可以像这样使用 以二进制方式打开的文件。两者都提供完整的读写功能 具有随机访问功能

    示例代码:(内存中的

    参考: 3.

    您可以使用:

    plt.savefig('name.png')
    
    您可以将其保存到“内存中”缓冲区,如下所示:

    image = plt.imshow(list, interpolation=None)
    
    # Save PNG to memory buffer as BytesIO
    from io import BytesIO
    buffer = BytesIO()
    
    plt.savefig(buffer,format='png')
    PNG = buffer.getvalue()
    
    如果您的意思是希望从中获得PIL/枕头图像:

    reloadedPILImage = Image.open(buffer)
    
    下面是的一个改编,用于处理两个数据列表。 请注意,当图像的数据范围不同时,该范围将取自绘制的第一个元素。解决方法是将vmin和vmax显式设置为全局最小值和最大值

    从matplotlib导入pyplot作为plt
    从matplotlib导入动画
    将numpy作为np导入
    x、 y=np.meshgrid(np.linspace(0,5,30),np.linspace(0,5,10))
    列表1=[np.sin(x+i*0.10)*np.cos(y+i*0.01)表示范围(50)内的i]
    列表2=[np.cos(x+i*0.01)*np.sin(y+i*0.10)表示范围(50)内的i]
    list1[0]=np.zeros_like(list1[0])#测试第一个元素只有一种颜色时会发生什么
    图=plt.图()
    ax1=图add_子批次(2,1,1)
    vmin1=min([l.min()表示列表1中的l])
    vmin2=min([l.min()表示列表2中的l])
    vmax1=max([l.max()表示列表1中的l])
    vmax2=max([l.max()表示列表2中的l])
    ax2=图add_子批次(2,1,2)
    im1=ax1.imshow(列表1[0],插值=None,动画=True,vmin=vmin1,vmax=vmax1)
    im2=ax2.imshow(列表2[0],插值=None,动画=True,cmap='inferno',vmin=vmin2,vmax=vmax2)
    def updatefig(一):
    im1.set_数组(列表1[i])
    im2.set_数组(列表2[i])
    返回im1,im2,
    ani=animation.FuncAnimation(图,updatefig,frames=len(列表1),interval=20,blit=True)
    plt.show()
    
    我不想将其作为文件,我需要一个图像对象,以将其保存在列表中。@Dusty:检查示例谢谢,但这对我没有帮助。我需要用很多图来做这件事,我以前无法将它们保存为文件。难道没有简单的方法吗?这不是一个基本的需要吗?@Dusty.:让我检查一下文档。我不明白的是:如果我用一个imshow()绘图就可以很容易地完成。难道不应该也有一个小地块的情节吗?我需要这些图像来制作动画。我不想将其作为文件,我需要一个图像对象,以将其保存在列表中。我想创建一个包含多个情节的动画,并将其渲染为视频。也许我的方法一开始就错了。我怎么做,是个大问题。对于单个imshow绘图,我可以将所有图像保存在列表中,然后使用matplotlib动画渲染视频。我将所有图像保存在图像列表中,然后执行动画:
    anim=animation.ArtistAnimation(图,图像,间隔=15,blit=True)
    我不熟悉这个话题,我担心我做错了什么。谢谢你更新这个问题。现在这是一个完全不同的问题。我创造了一个更清楚理解的新问题。谢谢你的时间,这不管用。它只是呈现我列表的第一个元素,因为
    im1=ax1.imshow(list1[0],interpolation=None,animated=True)
    只有列表的第一个元素被一次又一次地绘制出来。这是有道理的,因为im1和im2被定义为第0个元素的绘图。问题在于:
    im1=ax1.imshow(list1[0],interpolation=None,animated=True)
    at
    list1[0]
    。我尝试了很多,但是我不能让它正常工作。它在updatefig中循环很好。但打印始终与第一个列表项一起打印。在您的示例链接中,使用了一个函数:
    im=plt.imshow(f(x,y),animated=True)
    。这可能也是我所需要的。我没有运行Python 2。你为什么这么想?