matplotlib 如何在pandas dataframe中显示base64图像?

wqlqzqxt  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(154)

在我深入研究之前,这必须在内存中完成,而不将图像保存在本地(如果可能的话)。
我有一个matplotlib图表,是通过for循环创建的,并编码为base64链接。我希望能够显示在列堆叠计划作为图像,而不是在其当前的base64格式的base64链接。以下是查看表格的链接:
Table Image
下面是我用来将matplotlib图表转换为base64链接的代码,然后将它们附加到一个名为stacks的列表中,然后将其转换为一个表:

my_stringIObytes = BytesIO()
plt.savefig(my_stringIObytes, format='png')
my_stringIObytes.seek(0)
my_base64_jpgData = base64.b64encode(my_stringIObytes.read()).decode()

stacks.append(my_base64_jpgData)

字符串
然后在我的for循环之外是这样的,以便能够将图添加到我的汇总表中:

summary['Stacking Plan'] = stacks


我们的目标是能够将这些图表作为图像显示 Dataframe 。我没有能力保存图像,然后加载它们。
如果有更好的方法来做这件事,我也愿意接受。

vmjh9lq9

vmjh9lq91#

你就快成功了。
我假设您正在使用笔记本(否则,您需要知道如何呈现表格;在终端中,显然,这将是非常不同)
但是使用jupyter,您可以轻松地呈现HTML字符串,使用IPython
看到我自己的[mre]

import pandas as pd
from IPython.display import HTML
import numpy as np
from io import BytesIO
from PIL import Image
import base64

# A dataframe containing parameters for synthetic images
df=pd.DataFrame({'f1':[2,5], 'f2':[3, 1]})

# Some random images (I create the whole array of images)
# so a 4D array, with shape (len(df), 300, 300, 3)
# meaning len(df) 300×300 RGB images
x=np.linspace(0,2*np.pi,300)[None,None,:,None]
y=np.linspace(0,2*np.pi,300)[None,:,None,None]
phi=np.linspace(0,2*np.pi,3)[None,None,None,:]
f1=df.f1.values[:,None,None,None]
f2=df.f2.values[:,None,None,None]
imgs = np.sin(f1*x+phi)*np.sin(f2*y*phi) # Why not this

# So, now my example is set up. I have a dataframe with n rows. And n images.
# Let's fill the column with base 64 images.
# For this I need an image->string conversion
# that generates the image in HTML
# That is almost your code
def toB64(img):
    pimg=Image.fromarray((img*127+128).astype(np.uint8))
    my_stringIObytes = BytesIO()
    pimg.save(my_stringIObytes, format='png')
    my_stringIObytes.seek(0)
    b64 = base64.standard_b64encode(my_stringIObytes.read()).decode()
    return '<img src="data:image/png;base64,'+b64+'">' 
    # Difference is that I add the "data:image/png;base64,", to turn this base64 string into a "URL" (not a "link": the image is in the URL)
    # And that I add <img src=url> to turn this URL into an HTML image

# I can now create a new column containing the base64 images
df['imgs'] = [toB64(img) for img in imgs]

# And render the table
HTML(df.to_html(escape=False))

字符串
您缺少的两个重要行是toB64的最后一行,它从base64 URL创建img元素。最后一个是用HTML呈现表格(假设您在笔记本中)。escape=False意味着可能与html代码混淆的字符串内容不会像通常那样被转义,因此浏览器会将其视为真实的的HTML代码。
x1c 0d1x的数据

相关问题