Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Image 使用面板小部件以交互方式更新Holoviews图像_Image_Panel_Dashboard_Holoviews_Python Interactive - Fatal编程技术网

Image 使用面板小部件以交互方式更新Holoviews图像

Image 使用面板小部件以交互方式更新Holoviews图像,image,panel,dashboard,holoviews,python-interactive,Image,Panel,Dashboard,Holoviews,Python Interactive,我有一组灰度图像2D numpy数组,希望根据holoviews.MultiSelect小部件的状态同时显示其中的几个,但在MultiSelect小部件中进行选择时,无法获取要更新的图像。以下是一个最低限度的工作示例: pn.extension() import numpy as np import holoviews as hv from holoviews import opts hv.extension('bokeh') # Make grayscale test images ima

我有一组灰度图像2D numpy数组,希望根据holoviews.MultiSelect小部件的状态同时显示其中的几个,但在MultiSelect小部件中进行选择时,无法获取要更新的图像。以下是一个最低限度的工作示例:

pn.extension()

import numpy as np
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')

# Make grayscale test images
images = []
xmax, ymax = 2560, 1600
for i in range(5):
    # Gray background
    image = np.ones(shape=(ymax, xmax), dtype=np.uint8) * 200
    # Make each image unique with different position for a black square
    # with interior white square
    image[200*i:200*i + 400,200*i:200*i + 400] = 0
    image[200*i+175:200*i+175 + 50,200*i+175:200*i+175 + 50] = 255
    images.append(image)

# Make hv.Images objects
scale_factor = 8
bounds=(0, 0, xmax, ymax)   # Coordinate system: (left, bottom, right, top)
img_0 = hv.Image(images[0], bounds=bounds)
img_1 = hv.Image(images[1], bounds=bounds)
options = [
    opts.Image(cmap='gray',
               aspect='equal',
               frame_width=int(xmax/scale_factor),
               frame_height=int(ymax/scale_factor),
              )
]
img_0.opts(*options)
img_1.opts(*options)

# Set up selector object
image_selector = pn.widgets.MultiSelect(name="Choose image index", 
                                 options=[i for i in range(len(images))],
                                 size=6,
                                 width=120
                                )

# Define interactivity
@pn.depends(image_selector, watch=True)
def change_image_shown(image_selector):
    index = image_selector[0]
    img_0.data = images[index]
    if index != len(images) - 1:
        img_1.data = images[index + 1]
    else:
        img_1.data = images[index]

# Create panel layout
layout = pn.Row(image_selector, pn.Column(img_0, img_1))
layout
初始面板布局与预期一致,但当我在MultiSelect中选择索引时,图像不会更新。检查MultiSelect对象的值

图像选择器。值[0]


我得到了所选的索引,所以问题必须出在修饰的change\u image\u show函数中,但我没有尝试过任何有效的方法。我遗漏了什么?

所以您似乎误解了更新HoloViews绘图的模型。HoloViews元素不应在原地修改,而是设置一个回调,返回给定一组依赖项的更新绘图。然后将其包装在DynamicMap中,当触发事件时,DynamicMap将动态重新渲染

将numpy作为np导入 将全息视图导入为hv 从全息视图导入选项 高压分机“bokeh” 制作灰度测试图像 图像=[] xmax,ymax=25601600 对于范围5中的i: 灰色背景 image=np.onesshape=ymax,xmax,dtype=np.uint8*200 使每个图像具有唯一性,黑色正方形的位置不同 内部为白色方形 图像[200*i:200*i+400200*i:200*i+400]=0 图像[200*i+175:200*i+175+50200*i+175:200*i+175+50]=255 图像 使hv.Images成为对象 比例系数=8 边界=0,0,xmax,ymax坐标系:左、下、右、上 选项=[ opts.Imagecmap='gray', aspect='equal', 框架宽度=intxmax/比例系数, 框架高度=内部最大值/比例系数, ] 设置选择器对象 image_selector=pn.widgets.MultiSelect name=选择图像索引, 选项=[i代表rangelenimages中的i], 尺寸=6, 宽度=120, 值=[0,1] 定义交互性 @pn.dependsindexes=图像选择器 def IMG0索引: 索引=索引[0] 返回hv.Imageimages[index],bounds=bounds.opts*选项 @pn.dependsindexes=图像选择器 def IMG1索引: 索引=索引[0] 如果索引!=lenimages-1: 数据=图像[索引+1] 其他: 数据=图像[索引] 返回hv.Imageimages[index],bounds=bounds.opts*选项 创建面板布局 布局=pn.行 图像选择器, pn.列 hv.DynamicMapimg0, hv.DynamicMapimg1 布局
上面是使用模型对代码的重写。也就是说我对你的回电还是有点困惑。如果只使用第一个选定值,为什么要使用MultiSelect小部件?你想要简单的选择小部件吗?

你说得对,我不了解更新HoloViews图的模型。在浏览了几乎所有的文档之后,我错过了这一点。我还认为DynamicMap只适用于需要不断改变一个或多个参数的情况,这就是我在文档中看到的。我真的很感谢你帮我澄清了我的误解。上面的代码非常有用。使用MultiSelect元素的原因如下:我将有200-400个图像可供选择,而我对Select小部件的理解是,它会创建一个下拉菜单,如果要从中选择的项目太多,则会很难操作。我认为滚动浏览各种可能性会更容易,这正是MultiSelect所能实现的。它允许同时进行多个选择的能力与我的需要无关,所以我只需要获取它返回的第一项。我已经详细阅读了代码,以确保我理解它的工作原理。我对你的帮助感激不尽!很高兴你学到了一些东西。如果您错过了这一点,我们在文档方面显然做得不太好,因此欢迎您提出任何改进建议。您也提出了一个很好的观点,如果有一个类似MultiSelect的小部件,它允许只选择一个项目,iirc在面板中有一个问题,所以希望我或其他人很快有时间解决这个问题。