Python图像:带枕头的多个作物,用Bokeh分组并显示在一行中

Python图像:带枕头的多个作物,用Bokeh分组并显示在一行中,python,image,python-imaging-library,bokeh,Python,Image,Python Imaging Library,Bokeh,我有以下任务:生成多个图像裁剪,然后将它们分组显示在相邻的行中。 到目前为止,我设法根据坐标生成作物。我不知道如何按行显示图像,按“用户”分组,按“时间”排序。我应该使用Bokeh来绘制图像,因为会有更多的图需要集成。请帮忙 数据帧: #Import libraries import numpy as np from numpy import asarray import pandas as pd from PIL import Image import matplotlib as plt #

我有以下任务:生成多个图像裁剪,然后将它们分组显示在相邻的行中。 到目前为止,我设法根据坐标生成作物。我不知道如何按行显示图像,按“用户”分组,按“时间”排序。我应该使用Bokeh来绘制图像,因为会有更多的图需要集成。请帮忙

数据帧:

#Import libraries
import numpy as np
from numpy import asarray
import pandas as pd
from PIL import Image
import matplotlib as plt

#Create the dataframe
data = {'Time':  ['2586', '2836', '2986', '3269', '3702'],
        'Map': ['Buc.jpg', 'Buc.jpg', 'Buc.jpg', 'Buc.jpg', 'Buc.jpg'],
        'Index': ['9', '10', '11', '12', '13'],
        'PSize': ['250', '150', '283', '433', '183'],
        'X': ['751', '673', '542', '762', '624'],
        'Y': ['458', '316', '287', '303', '297'],
        'User': ['u1', 'u1', 'u2', 'u2', 'u2'],
        }

columns = ['Time','Map','Index','PSize','X','Y','User']

df = pd.DataFrame (data, columns = columns)
df = df.astype(dtype= {"Time":"int64", "Map":"object","Index":"int64", 'PSize':'int64', 'X': 'int64', 'Y':"int64", 'User':'object'})
df.head()
图像文件:

根据坐标生成作物:

#Create coordinate and crop the image
imagefile = 'Buc.jpg'
coordinates = list(df[['X', 'Y']].itertuples(index=False, name=None))
psize = 100

img = Image.open(imagefile)
for x, y in coordinates:
      box = (x-psize/2, y-psize/2, x+psize/2, y+psize/2)
      img.crop(box).show('%s.x%03d.y%03d.jpg'% (imagefile.replace('.jpg',''), x, y))
输出示例:


类似这样的事情。请注意,运行脚本时,
Buc.jpg
必须在当前工作目录中可用

将numpy导入为np
作为pd进口熊猫
从PIL导入图像
来自bokeh.io导入展
从bokeh.models导入FixedTicker、FuncTickFormatter、ColumnDataSource
从bokeh.plotting导入图形
从bokeh.transform导入道奇
df=pd.DataFrame({'Time':[25862836298632693702],
“X”:[751673542762624],
"Y":[458,316,287,303,297],,
'用户':['u1','u1','u2','u2','u2']})
imagefile='Buc.jpg'
坐标=列表(df['X','Y']].itertuples(index=False,name=None))
psize=100
img=Image.open(imagefile.convert('RGBA'))
裁剪的_图像=[]
对于坐标中的x,y:
框=(x-psize/2,y-psize/2,x+psize/2,y+psize/2)
裁剪的图片.append(np.array(img.crop(box)).view(np.uint32)[::-1])
df['Image']=裁剪的图像
#也许有更好的方法来填充'TimeCoord',我不知道。
df=df.sort_值(“时间”)
df['TimeCoord']=0
对于df['User']中的u。唯一()
udf=(df['User']==u)
df.loc[udf,'TimeCoord']=np.arange(udf.sum())
user_coords=dict(zip(df['user'].unique(),range(df.shape[0]))
df['UserCoord']=df['User'].替换(用户协调)
p=图(匹配方面=真)
对于[p.xaxis,p.xgrid,p.ygrid]中的r:
r、 可见=假
#手动创建一个类似于axis的分类,以确保我们可以在下面使用'dodge'。
p、 yaxis.ticker=FixedTicker(ticks=list(user\u coords.values())
p、 yaxis.formatter=FuncTickFormatter(args=dict(rev_user_coords={v:k代表k,v在user_coords.items()中),
code=“return rev_user_coords[勾选];”)
ds=列数据源(df)
img_尺寸=0.8
p、 image_rgba(image='image',
x=dodge('TimeCoord',-img_size/2),y=dodge('UserCoord',-img_size/2),
dw=img_尺寸,dh=img_尺寸,震源=ds)
p、 rect(x='TimeCoord',y='UserCoord',width=img\u size,height=img\u size,source=ds,
线条(虚线,填充字母=0)
表演(p)

不清楚“按“用户”分组,按“时间”排序”是什么意思。你能提供一个想要的输出的例子吗?我刚刚上传了一张图片作为例子。小图像按用户显示。在这种情况下,我们只有2,u1和u2。图像的显示顺序是“时间”顺序,但也可以是“索引”(请参见数据框中的列)。非常好,谢谢!这似乎是我期望得到的结果。唯一不起作用的是用户在yaxis上订购。